Top K问题+查找和最小的k对数字

比如给你一个很大的数据,让你找前1000大的数据
遍历数据,和擂台上的最小值,如果比最小值大,把原来的最小值淘汰掉,把当前数据加入擂台。
擂台就是一个小堆,很方便找到最小值。

为了更好的理解这个例子:我在下面画图说明。
例如有这么一组数据{1,2,3,4,5,6,7,8},我们要找这组数据前三的数据
首先第一步,我们创建一个擂台,也就是堆,这个擂台放三个人,例如1,2,3三个人先打比赛了,就上去了

在这里插入图片描述
因为是小堆,所以1在最上面
但这里占类台方式不一样,我们以“抢打出头鸟,抢打菜鸟“的思想,1最小,就站在最上面
上面那句话的意思就是,紧接着,4号要打擂台了,挑最弱的1,发现4比1打,这样4就成功跑到1的位置(覆盖)
在这里插入图片描述
但是因为擂台是小堆,4不是擂台最菜的呀,这样就需要调整了,2是最菜的,从4开始向下调整,2就跑到顶了
遍历完这组数据后,7,8,9三个最强者就成功站上擂台,并且7在最顶层,8和9在次层


k表示找前k大数字
N表示数字总量

时间复杂度N*log(k); 近似看成O(N)
空间复杂度:O(k) 近似看成常量


到了这里,我们找到了前k大的元素的值。它们这时都在擂台上,但是,我们只知道最顶层的是最小的
不知道这k个元素的大小关系,
这时候就需要用到堆排序思想了
循环的把堆顶元素删除,尾插到一个新的数组中
这样这个数组就是个从小到大的顺序了
时间复杂度:O(Nlog(N))
N是循环取删堆顶元素的操作
log(N)是删完都要调整堆


查找和最小的k对数字

题目网址:
https://leetcode-cn.com/problems/find-k-pairs-with-smallest-sums/

class Solution {
   
   static class Pair implements Comparable<Pair>{
   
        public int num1;
        public int num2;
        public int sum;

        public 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值