一、大根堆: 子树的头是最大值。
二、给一个无序的数组,将整个数组变成
a1>= a2<= a3 >= a4…的形式,要求空间复杂度O(1);
三、
解法1、如果用插入排序,复杂度是K N
解法2、移动距离不超过6,所以前7个数字里面的最小值一定是整体的最小值。求一个数的最小值朴素算法复杂度是n,但是如果用小根堆, 每一次只调整一个数,那么平均就变成了logN。
比如k = 6,
step1: 准备一个小根堆,先遍历前7个数,拍完序之后,最小值一定在头位置,
step2 :然后删除头节点,调整小根堆,继续加入下一个数字,堆的大小永远是k+1, 所以总体复杂度是Nlog7
step3: 剩下的依次弹出。
tips:小根堆在java中是优先级队列。
/**
* @author 张伟-算法
* @version 1.0
* @date 2021/9/9 5:04 下午
*/
public class T7_MinHeap {
public static void main(String[] args) {
int[] arr = {8,4,9,10};
PriorityQueue<Integer> heap = new PriorityQueue<>();
int k = 2;
int cur = 0;
for(int i = 0 ; i < arr.length; i ++ ){
if(i <= k ){
heap.add(arr[i]);
}
else {
arr[cur++] = heap.poll();
heap.add(arr[i]);
}
}
while(heap.size()>0){
arr[cur++] = heap.poll();
}
System.out.println(Arrays.toString(arr));
}
}
左程云版本:
注意:左程云16-17行,他这里到达index位置的时候,第16行先加入heap,在进行poll,感觉应该倒过来。
tips:
1、堆结构用到的数组空间当耗尽的时候是会扩容的,如果是N的数据量,扩容次数为logN次,每次做数组拷贝,总时间复杂度是NlogN次,那么平均增加一条数据时间复杂度是N*logN / N ,还是N
2、系统提供的函数,是一个黑盒,对外只提供增加删除吗,如果做修改某一个元素的那么不能自动地进行调整。
四、需要手写堆调整功能的题目。