215.Kth Largest Element in an Array === ###### tags: `Medium` `Array` `Divide and Conquer` `Sorting` `Heap` [215. Kth Largest Element in an Array](https://leetcode.com/problems/kth-largest-element-in-an-array/) ### 題目描述 Given an integer array `nums` and an integer `k`, return *the k^th^ largest element in the array.* Note that it is the k^th^ largest element in the sorted order, not the k^th^ distinct element. Can you solve it without sorting? ### 範例 **Example 1:** ``` Input: nums = [3,2,1,5,6,4], k = 2 Output: 5 ``` **Example 2:** ``` Input: nums = [3,2,3,1,2,4,5,5,6], k = 4 Output: 4 ``` **Constraints**: * 1 <= `k` <= `nums.length` <= 10^5^ * -10^4^ <= `nums[i]` <= 10^4^ ### 解答 #### Python ```python= class Solution: def findKthLargest(self, nums: List[int], k: int) -> int: data = nums[:k] heapq.heapify(data) for num in nums[k:]: heapq.heappushpop(data, num) return min(data) ``` > [name=Yen-Chi Chen][time=Mon, Aug 14, 2023] #### TypeScript - quick select partition 函式會回傳一個 pivot,這個 pivot 左邊的元素都比 pivot 大,右邊的元素都比 pivot 小,不斷呼叫 partition 然後每次檢查 pivot 的位置是否為 k - 1,如果是的話就回傳 pivot 的值。 ```typescript! function partition(arr: number[], left: number, right: number) { const pivot = arr[right]; while (left < right) { while (left < right && arr[left] >= pivot) { left++; } arr[right] = arr[left]; while (left < right && arr[right] <= pivot) { right--; } arr[left] = arr[right]; } arr[right] = pivot; return left; } function findKthLargest(nums: number[], k: number): number { let low = 0; let high = nums.length - 1; let pivot = partition(nums, low, high); while (pivot !== k - 1) { if (pivot > k - 1) { high = pivot - 1; pivot = partition(nums, low, high); } else { low = pivot + 1; pivot = partition(nums, low, high); } } return nums[pivot]; } ``` - counting sort ```typescript! function findKthLargest(nums: number[], k: number): number { const n = nums.length; let max = nums[0]; let min = nums[0]; for (const num of nums) { if (num > max) { max = num; } if (num < min) { min = num; } } const size = max - min + 1; const buckets = new Array(size).fill(0); for (let i = 0; i < n; i++) { buckets[nums[i] - min]++; } let remain = k; for (let i = size - 1; i >= 0; i--) { remain -= buckets[i]; if (remain <= 0) { return i + min; } } return -1; } ``` > [name=Sheep][time=Mon, Aug 14, 2023] #### C++ ``` cpp= class Solution { public: int findKthLargest(vector<int>& nums, int k) { priority_queue<int, vector<int>, greater<int>> kthFinder; for (int num : nums) { kthFinder.push(num); while (kthFinder.size() > k) { kthFinder.pop(); } } return kthFinder.top(); } }; ``` > [name=Jerry Wu][time=14 Aug 2023] ### Reference [回到題目列表](https://marsgoat.github.io/XNnote/coding/leetcodeEveryDay.html)