首页
文章
取消

🟧概述

🔻含义: 堆是通过数组化二叉树 同时通过构建堆和重建堆 来实现获取最大值和最小值的数据结构

🔻试用场景: 查找最大值和最小值、排序、频率、topK问题

🔻时间复杂度: O(nlogN)

🔻空间复杂度: O(1)

🔻注意事项:

🔸是使用大根堆还是小根堆

🟧模板

📌优先队列

1
2
3
4
5
6
7
8
9
class Solution {
    public int heap(int[] nums) {
      //默认小根堆
      PriorityQueue<Integer> minHeap =new PriorityQueue<>((a,b)->(int)(a-b));

      //大根堆
      PriorityQueue<Integer> maxHeap =new PriorityQueue<>((a,b)->(int)(b-a));
  }
}

📌原生写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class Solution {
  //堆排序
  public int[] sortArray(int[] nums) {
    heapSort(nums);
    return nums;
  }

  public void heapSort(int[] nums) {
    int len = nums.length-1;
    buildHeap(nums,len);
    for(int i=len;i>=1;--i){
      swap(nums,i,0);
      --len;
      reBuildHeap(nums,len,0);
    }
  }

  public void buildHeap(int[] nums,int len) {
    for(int i=len/2;i>=0;--i){
      reBuildHeap(nums,len,i);
    }
  }

  public void reBuildHeap(int[] nums,int len,int i) {
    for(;((i<<1)+1)<=len;){
      int l=(i<<1)+1;
      int r=(i<<1)+2;
      int big=0;

      if(l<=len&&nums[l]>=nums[i]){
        big = l;
      }else{
        big = i;
      }

      if(r<=len&&nums[r]>=nums[big]){
        big = r;
      }

      if(i!=big){
        swap(nums,i,big);
        i=big;
      }else{
        break;
      }
    }
  }

  void swap(int[]nums,int l,int r){
    int t = nums[l];
    nums[l]=nums[r];
    nums[r]=t;
  }
}

🟧总结

🔻总结1:堆的各项复杂度指标

🔸时间复杂度:O(nlogN)

🔸空间复杂度:O(1)

🔻总结2:堆使用场景

🔸排序、topK等

🟧思考

🔻思考1:堆的为何使用数组化二叉树存储数据?

🔸

🟧泛化

🔻泛化1:从堆使用数组化二叉树存储数据能得到什么启发?

🔸

本文由作者按照 CC BY 4.0 进行授权

滑动窗口

-