No.1
题目
思路
- 编写单调队列类
- 讲解
代码
class MonoQue {
Deque<Integer> deque = new LinkedList<>();
// 弹出元素时,比较当前要弹出的值是否等于队列出口的值,相等则弹出
// 同时判断队列此时是否为空
void poll(int val) {
if (!deque.isEmpty() && deque.peek() == val)
deque.poll();
}
// 添加元素时,如果要添加的元素大于入口处的元素,则将入口元素弹出
// 保证队列单调递减
void add(int val) {
while (!deque.isEmpty() && val > deque.getLast())
deque.removeLast();
deque.add(val);
}
// 队列出口元素始终为最大值
int peek() {
return deque.peek();
}
}
public int[] maxSlidingWindow(int[] nums, int k) {
MonoQue monoQue = new MonoQue();
int[] res = new int[nums.length - k + 1];
for (int i = 0; i < k; i++) {
monoQue.add(nums[i]);
}
int left = 0, right = k, index = 0;
// 初始化,取出最大值
res[index++] = monoQue.peek();
while (right < nums.length) {
monoQue.poll(nums[left++]);
monoQue.add(nums[right++]);
res[index++] = monoQue.peek();
}
return res;
}
No.2
题目
思路
- 优先队列,小顶堆
- 队列poll的只剩下前K个高频元素
代码
public int[] topKFrequent(int[] nums, int k) {
int[] result = new int[k];
// (number, frequency)
Map<Integer, Integer> map = new HashMap<>();
// 统计频率
for (int item : nums)
map.put(item, map.getOrDefault(item, 0) + 1);
PriorityQueue<int[]> pq = new PriorityQueue<>((pair1, pair2) -> pair1[1] - pair2[1]);
for (Map.Entry<Integer, Integer> entry: map.entrySet()) {
if (pq.size() < k) {
pq.add(new int[]{entry.getKey(), entry.getValue()});
} else { // pq.size() >= k
// 只有当前频率大于小顶堆频率时才弹出,考虑以下例子:
// k=2, 频率数组=[3,2,1]
// 不能为了1,把3弹出
if (entry.getValue() > pq.peek()[1]) {
pq.poll();
pq.add(new int[]{entry.getKey(), entry.getValue()});
}
}
}
int index = 0;
while (pq.size() > 0)
result[index++] = pq.poll()[0];
return result;
}
标签:deque,pq,nums,int,add,Day13,new,Leetcode,刷题
From: https://www.cnblogs.com/tomatoQt/p/17658183.html