题意:
在未排序的数组中找到第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
数据范围:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
解法:
根据快排的划分性质,
每次将序列划分为左边>=x,右边<=x的两部分,
如果左边的长度>=k,那么答案一定在左边,递归左边,
否则递归右边,k变为k-(左边长度).
code:
class Solution {
public:
int qsort(vector<int>& a,int l,int r,int k){
if(l==r)return a[l];
int p=l+rand()%(r-l+1);
int x=a[p];
int i=l-1,j=r+1;
while(i<j){
do i++; while(a[i]>x);
do j--; while(a[j]<x);
if(i<j){
swap(a[i],a[j]);
}
}
if(j-l+1>=k)return qsort(a,l,j,k);
else return qsort(a,j+1,r,k-(j-l+1));
}
int findKthLargest(vector<int>& a, int k) {
int n=a.size();
return qsort(a,0,n-1,k);
}
};