代码随想录算法训练营第第13天 | 239. 滑动窗口最大值 、347.前 K 个高频元素
- 滑动窗口最大值 (一刷至少需要理解思路)
之前讲的都是栈的应用,这次该是队列的应用了。
本题算比较有难度的,需要自己去构造单调队列,建议先看视频来理解。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0239.滑动窗口最大值.html
/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var maxSlidingWindow = function(nums, k) {
const res = [];
const queue = [0];
for(let i=1;i<k;i++){
while(queue.length&&nums[queue[queue.length-1]]<=nums[i]){
queue.pop();
}
queue.push(i);
}
res.push(nums[queue[0]]);
for(let i=k;i<nums.length;i++){
while(queue.length&&nums[queue[queue.length-1]]<=nums[i]){
queue.pop();
}
queue.push(i);
while(queue[0] + k <= i){
queue.shift();
}
res.push(nums[queue[0]]);
}
return res;
};
347.前 K 个高频元素 (一刷至少需要理解思路)
大/小顶堆的应用, 在C++中就是优先级队列
本题是 大数据中取前k值 的经典思路,了解想法之后,不算难。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0347.前K个高频元素.html
/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var topKFrequent = function(nums, k) {
const res = [];
const map = new Map();
for (let num of nums) {
map.set(num, (map.get(num) || 0)+1);
}
const head = new PriorityQueue({
compare: (a, b) => a.value - b.value
})
for(let [key,value] of map){
head.enqueue({key,value});
if (head.size()>k) {
head.dequeue();
}
}
while(head.size()) res.push(head.dequeue().key);
return res;
};