###### tags: `Leetcode` `medium` `sort` `quickselect` `python` `c++` `Top 100 Liked Questions` # 215. Kth Largest Element in an Array ## [題目連結:] https://leetcode.com/problems/kth-largest-element-in-an-array/description/ ## 題目: Given an integer array ```nums``` and an integer ```k```, return the ```kth``` largest element in the array. Note that it is the ```kth``` largest element in the sorted order, not the ```kth``` distinct element. You must solve it in ```O(n)``` time complexity. **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 ``` ## 解題想法: * 題目為要求O(n)時間求出第K大的數字,於未排序且可能有重複數字的數組 * 使用Qick Select * Step1: * pivot=random.choice(nums) #隨機選一點 * small=[ ] #存小於pivot的數 * big=[ ] #存大於pivot的數 * Step2: * 遍歷所有數字存於small與big中 * Step3: * 先看len(big)數量是否大於滿足k ``` python= #若滿足,表示大於k的太多了 #將範圍縮小遞迴求解: if k<=len(big): return self.findKthLargest(big,k) ``` * Step4: * 否則表示K數量太多 * K多過於 **len(big)+pivot的數量** * 所以遞迴從small中找(k-len(big)-pivot的數量) ``` python= elif k> (len(nums)-len(small)): return self.findKthLargest(small,k-(len(nums)-len(small))) ``` * **len(big)+pivot的數量** * 即為: **len(num)-len(small)** * 因為對於small、big存入的數字,皆不考慮等於pivot的值,所以若pivot有重複: * 有可能 len(nums)>= len(big)+len(small) ## Python: ``` python= import random class Solution(object): def findKthLargest(self, nums, k): """ :type nums: List[int] :type k: int :rtype: int """ #Quick select pivot = random.choice(nums) small=[] big = [] #先分堆O(n) for i in nums: #不用等於 因為不考慮重複值 所以有可能 len(nums)>= len(big)+len(small) if i<pivot: small.append(i) elif i>pivot: big.append(i) #看big數量是否滿足k if k<=len(big): return self.findKthLargest(big,k) #要用len(num)-len(small) #否則為K的數量還是太多了 K多過於 len(big)+pivot的數量 # len(big)+pivot的數量 即為: len(num)-len(small) elif k> (len(nums)-len(small)): return self.findKthLargest(small,k-(len(nums)-len(small))) return pivot result = Solution() nums = [3,2,3,1,2,4,5,5,6] k = 4 ans = result.findKthLargest(nums,k) print(ans) ``` ## C++: ``` cpp= #include<bits/stdc++.h> using namespace std; class Solution { public: int findKthLargest(vector<int>& nums, int k) { int random = rand()% nums.size(); int pivot = nums[random]; vector<int> small, big; //collect for (int val: nums){ if (val<pivot) small.push_back(val); else if (val>pivot) big.push_back(val); } //compare if (k<=big.size()) return findKthLargest(big, k); else if (k> nums.size()-small.size()) return findKthLargest(small, k-(nums.size()-small.size())); else return pivot; } }; int main(){ Solution* res= new Solution(); vector<int> nums={3,2,1,5,6,4}; int k=2; int ans=res->findKthLargest(nums,k); cout<<ans<<endl; return 0; } ```