1.使用最大最小堆。求最大的数用最小堆,求最小的数用最大堆。
2.Quick Select算法。使用类似快排的思路,根据pivot划分数组。
3.使用排序方法,排序后再寻找top K元素。
4.使用选择排序的思想,对前K个元素部分排序。
5.将1000…个数分成m组,每组寻找top K个数,得到m×K个数,在这m×k个数里面找top K个数。
使用堆的思路:
按顺序扫描这10000个数,先取出K个元素构建一个大小为K的最小堆。每扫描到一个元素,如果这个元素大于堆顶的元素(这个堆最小的一个数),就放入堆中,并删除堆顶的元素。如果这个元素小于堆顶的元素,就直接pass。最后堆中剩下的元素就是最大的前Top K个元素,堆顶元素就是第k大的元素。
代码:
void f(const vector<int>& nums,int k){
priority_queue<int> q;
for(int i = 0;i < nums.size();++i){
if(q.size() < k){
q.push(nums[i]);
}else{
if(q.top() >= nums[i]){
continue;
}else{
q.pop();
q.push(nums[i]);
int x = q.top();
}
}
}
}