数据结构8 堆(Heap)

  1. 堆:一种二叉树的结构–完全二叉树,且每个节点的值都≥或≤孩子节点。
  2. 最大堆:每个节点的值都≥孩子节点(堆顶元素是最大值)
  3. 最小堆:每个节点的值都≤孩子节点(堆顶元素是最小值)
  4. 复杂度
  • 访问(acess):无
  • 搜索:O(1) (堆顶)
  • 添加:O(logN)
  • 删除:O(logN) 一般是堆顶
  1. Python常用操作
import heapq
//创建堆
minheap = []

//添加元素
heapq.heappush(minheap,10)
heapq.heappush(minheap,8)
heapq.heappush(minheap,6)
heapq.heappush(minheap,2)
heapq.heappush(minheap,11)

//查看堆顶元素
print(minheap[0])

//删除堆顶元素
heapq.heappop(minheap)

//长度
len(minheap)
# empty?
len(s)==0

//遍历
while len(minheap)!=0:
	print(heap.heappop(minheap))

//最大堆则将元素乘以-1再进行操作
  1. java常用操作
//创建最小堆
PriorityQueue<Integer> minheap = new PriorityQueue<>();
//创建最大堆
PriorityQueue<Integer> maxheap = new PriorityQueue<>(Collections.reverseOrder());

//添加元素
minheap.add(10);
minheap.add(8);
minheap.add(9);
minheap.add(11);
minheap.add(2);
maxheap.add(10);
maxheap.add(8);
maxheap.add(9);
maxheap.add(11);
maxheap.add(2);
System.out.println(minheap.toString());  //[2,8,9,11,10]
System.out.println(maxheap.toString());  //[11,10,9,8,2]

//查找堆顶元素
minheap.peek();
maxheap.peek();

//删除
minheap.poll();
maxheap.poll();

//长度
minheap.size();
maxheap.size();

//遍历
while(!minheap.isEmpty()){
  System.out.println(minheap.poll());
}
  1. 例题
    在这里插入图片描述
class Solution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> maxheap = new PriorityQueue<>(Collections.reverseOrder());
        for(int i = 0;i<nums.length;i++){
            maxheap.add(nums[i]);
        }
        while(k>1){
            maxheap.poll();
            k -= 1;
        }
        return maxheap.peek();
    }
}
class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        minheap = []
        for i in nums:
            n = (-1)*i
            heapq.heappush(minheap,n)
        while k>1:
            heapq.heappop(minheap)
            k -= 1
        return minheap[k-1]*(-1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值