思路:
- 利用快排的partition确定第k大的位置在哪
- 快排的递归条件为三个 是否找到,没有找到接下来往左递归还是往右递归?
- 为了加快算法速度,引入随机种子,每次挑选不一样的中枢
代码:
class Solution {
public:
int quickSelect(vector<int>& a, int l, int r, int index) {
int q = partition(a, l, r);
if (q == index)
return a[q];
else
return q < index ? quickSelect(a, q + 1, r, index) : quickSelect(a, l, q - 1,index);
}
inline int partition(vector<int>& a, int l, int r) {
srand(time(0));
int random = rand() % (r - l + 1) + l;
swap(a[random], a[l]);
int x = a[l];
while(l<r){
while(l<r&&a[r]>=x) r--;
a[l]=a[r];
while(l<r&&a[l]<=x) l++;
a[r]=a[l];
}
a[l]=x;
return l;
}
int findKthLargest(vector<int>& nums, int k) {
return quickSelect(nums, 0, nums.size() - 1, nums.size() - k);
}
};