首页 > 其他 > 详细

Leetcode刷题记录(二)2021.3.29 堆

时间:2021-03-29 14:15:29      阅读:15      评论:0      收藏:0      [点我收藏+]

Leetcode刷题记录(二)2021.3.29 堆

Java中PriorityQueue的用法

PriorityQueue<Integerpq new PriorityQueue<>(new Comparator<Integer>(){
 public int compare(Integer a,Integer b){
   return a-b;//a是刚插入该优先队列的数值,如果return的数小于0,则上升,return的数大于0则下降
   //当a-b<0时,a上升,由此可知该优先队列是最小堆
}
});
Map<Integer,Integermap new HashMap();
map.put(key,value);
map.get(key);
map.containsKey();
map.keySet();//所有key的集合,用这个方法可以遍历hashmap
PriorityQueue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>(){
public int compare(Integer a,Integer b){
  return nums[b]-nums[a];//这样当nums[a]>nums[b]的时候,就为负值,a结点就可以上升了
}
});
nums = [1,3,-1,-3,5,3,6,7], k = 3

类似top k算法

当小根堆中元素数量不足k个,那就直接放入;如果元素数量等于k了,就需要判断当前小根堆根结点的频度和当前正在遍历的key的频度,如果key的频度大于根结点频度,就得把根结点弹出来,把key放进小根堆里

然后对于哈希表里面的每个key进行遍历,放入小根堆中

首先将元素和它的频度匹配,可想而知是使用哈希表

前k个,首先是堆可以实现,其次是冒泡排序k次可以实现,还有快速排序也可以实现,又因为时间复杂度要优于 O(n log n),所以选择堆和快排,为了简单就是用堆排序

看到这个题目,肯定是将元素按照频率排序,然后找出前k个

给定一个非空的整数数组,返回其中出现频率前k高的元素。时间复杂度必须优于 O(n log n)

347.前k个高频元素

 

在真正实现时,队列中存储的应该是数值的索引,这样比较好判断是否在滑动窗口范围内

step6:[6]->[7],当前滑动窗口最大值为7

step5:[5,3]->[6],当前滑动窗口最大值为6

step4:[5]->[5,3],当前滑动窗口最大值为5

step3:[3,-1,-3]->[5],当前滑动窗口最大值为5

step2:[3,-1]->[3,-1,-3],当前滑动窗口最大值为3

step1:[1]->[3]->[3,-1],当前滑动窗口最大值为3

并且要让队头元素的索引都在滑动窗口范围内。

维护一个队列,让这个队列都是降序排列的,每进来一个新的数,从队列后面弹出所有比这个数小的数(因为最大值不可能在这些需要被弹出的数中产生),直到这个队列又是降序为止

考虑一下

2.降序队列解决

每次从优先队列里弹出最大值就行

维护一个优先队列,当优先队列里里面根结点<index-k+1时,就证明该结点不在滑动窗口范围内,就得把这个结点删除

优先队列是这样实现的:

首先,让优先队列里存储的是每个数字的下标,然后排序的时候按照下标对应的数组元素进行排序,优先队列得是一个大根队

1.优先队列解决

老大难问题,之前考虑了很久没有考虑出来,现在学会用优先队列了,开始happy了

给一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。

239.滑动窗口最大值

 

把每条链表的当前结点放入优先队列中(最小堆),然后从优先队列中取出当前val最小的结点。如果该结点有后继,就把该结点的后继放入优先队列中。

2.优先队列法

把每个链表的结点都放入优先队列中(最小堆),然后从优先队列中取出,形成一条升序链表

1.暴力破解法

给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。

23.合并K个升序链表

 

Java中HashMap的用法

Leetcode刷题记录(二)2021.3.29 堆

原文:https://www.cnblogs.com/boyaBlog/p/14591824.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!