代码随想录训练营第13天|239. 滑动窗口最大值, 347.前 K 个高频元素
)
239. 滑动窗口最大值
文章
视频
单调队列正式登场!| LeetCode:239. 滑动窗口最大值
思路
用队列维护一组下标,使得队首在窗口移动过程中先离开窗口且从队首到队尾所对应原数组的元素是递减的,这样可以保证队首元素离开窗口时新的队首元素标识了当前窗口下一个要离开的最大值;如果新入队一个元素,需要从队尾开始移除比它小的。
代码
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
LinkedList<Integer> q = new LinkedList<>();
int i, n;
n = nums.length;
int[] ans = new int[n - k + 1];
for (i = 0; i < k; ++i) {
while (!q.isEmpty() && nums[q.getLast()] < nums[i]) {
q.removeLast();
}
q.add(i);
}
ans[i - k] = nums[q.getFirst()];
while (i < n) {
if (q.getFirst() + k <= i) {
q.removeFirst();
}
while (!q.isEmpty() && nums[q.getLast()] < nums[i]) {
q.removeLast();
}
q.add(i);
++i;
ans[i - k] = nums[q.getFirst()];
}
return ans;
}
}
347.前 K 个高频元素
文章
视频
优先级队列正式登场!大顶堆、小顶堆该怎么用?| LeetCode:347.前 K 个高频元素
思路
首先要统计各元素出现的频次,所以需要用HashMap
来保存,这个过程需要先遍历一遍原数组
然后用大小为k的大顶堆来保存前K大的元素,这个过程需要将map遍历,并插入大顶堆
最后不断poll大顶堆直至为空并返回数组结果
代码
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
PriorityQueue<Integer> pq = new PriorityQueue<>(k, (o1, o2) -> {
return map.get(o2) - map.get(o1);
});
for (int num: nums) {
if (!map.containsKey(num)) {
map.put(num, 1);
} else {
map.put(num, map.get(num) + 1);
}
}
map.forEach((key, value)->{pq.offer(key);});
int[] res = new int[k];
int i;
for (i = 0; i < k; ++i) {
res[i] = pq.poll().intValue();
}
return res;
}
}
总结
都是二刷,记忆还在。