Java中PriorityQueue的用法
PriorityQueue<Integer> pq = 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,Integer> map = 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
当小根堆中元素数量不足k个,那就直接放入;如果元素数量等于k了,就需要判断当前小根堆根结点的频度和当前正在遍历的key的频度,如果key的频度大于根结点频度,就得把根结点弹出来,把key放进小根堆里
然后对于哈希表里面的每个key进行遍历,放入小根堆中
首先将元素和它的频度匹配,可想而知是使用哈希表
前k个,首先是堆可以实现,其次是冒泡排序k次可以实现,还有快速排序也可以实现,又因为时间复杂度要优于 O(n log n),所以选择堆和快排,为了简单就是用堆排序
看到这个题目,肯定是将元素按照频率排序,然后找出前k个
给定一个非空的整数数组,返回其中出现频率前k高的元素。时间复杂度必须优于 O(n log n)
在真正实现时,队列中存储的应该是数值的索引,这样比较好判断是否在滑动窗口范围内
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 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。
把每条链表的当前结点放入优先队列中(最小堆),然后从优先队列中取出当前val最小的结点。如果该结点有后继,就把该结点的后继放入优先队列中。
2.优先队列法
把每个链表的结点都放入优先队列中(最小堆),然后从优先队列中取出,形成一条升序链表
1.暴力破解法
给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。
Java中HashMap的用法
原文:https://www.cnblogs.com/boyaBlog/p/14591824.html