比如给你一个很大的数据,让你找前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