top K问题解决方案

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();
        	}
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值