赞
踩
创建:
PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>(){
public int compare(int[] pair1, int[] pair2){
return pair1[0] != pair2[0] ? pair2[0] - pair1[0] : pair2[1] - pair1[1];
}
});
遍历存放数组的值和下标(可以指定数量):
for(int i = 0; i < k; i++){
pq.offer(new int[]{nums[i],i});
}
使用
队列是遵循先进先出(First-In-First-Out)模式的,但有时需要在队列中基于优先级处理对象。
原理
Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示(任意一个非叶子节点的权值,都不大于其左右子节点的权值)
方法
add()和offer(),插入失败时前者会抛出异常,后者会返回false
element()和peek(),返回队顶元素,前者抛异常,后者返回null
remove()和poll(),删除队首元素,前者抛异常,后者返回null
remove(Object o),删除队列中跟o相等的某一个元素(如果有多个相等,只删除一个),该方法不是Queue接口内的方法,而是Collection接口的方法。
例题
https://leetcode-cn.com/problems/sliding-window-maximum/
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>(){
public int compare(int[] pair1, int[] pair2){
return pair1[0] != pair2[0] ? pair2[0] - pair1[0] : pair2[1] - pair1[1];
}
});
for(int i = 0; i < k; i++){
pq.offer(new int[]{nums[i],i});
}
int[] ans = new int[n-k+1];
ans[0] = pq.peek()[0];
for(int i = k; i < n; i++){
pq.offer(new int[]{nums[i],i});
while(pq.peek()[1] <= i - k){
pq.poll();
}
ans[i-k+1] = pq.peek()[0];
}
return ans;
}
}
前k个最小数
List<String> ans = new ArrayList<>();
for(int i = 1;i <= n; i++){
String cur = "";
cur = i + "";
ans.add(cur);
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。