1.滑动窗口最大值 leecode 239
维护一个单调递减队列
主要分为三个函数
1.push,遍历数组,将数组元素push进去,如果当前push的元素,大于队列的最后一个元素,则将这个元素前面的所有元素pop出去,始终保持队首的元素为最大值

2.shift,移除的元素value等于单调队列的出口元素,那么队列弹出元素,否则不用任何操作

3.getMaxValue,每次取队列首位元素,获取最大值放在结果集里面
代码实现
var maxSlidingWindow = function (nums, k) {
class MonoQueue {
constructor() {
this.queue = [];
}
// 进入队列
enqueue(value) {
let back = this.queue[this.queue.length - 1];
while (back !== undefined && back < value) {
this.queue.pop();
back = this.queue[this.queue.length - 1];
}
this.queue.push(value);
}
// 弹出队列
dequeue(value) {
let front = this.front();
if (front === value) {
this.queue.shift();
}
}
// 获取队首元素
front() {
return this.queue[0];
}
}
let helperQueue = new MonoQueue();
let i = 0, j = 0;
let resArr = [];
// 首先将前k个放入队列中
while (j < k) {
helperQueue.enqueue(nums[j++]);
}
// 队首元素为最大值,将它放入结果集中
resArr.push(helperQueue.front());
while (j < nums.length) {
helperQueue.enqueue(nums[j]);
helperQueue.dequeue(nums[i]);
resArr.push(helperQueue.front());
i++, j++;
}
return resArr;
};
2.前 K 个高频元素 LeetCode347
解题思路:
1.统计每个元素出现的次数
2.排序
3.截取前k个
代码实现
var topKFrequent = function(nums, k) {
let map = new Map();
for (let num of nums) {
map.set(num, (map.get(num) || 0) + 1);
}
return [...map.entries()]
.sort((a, b) => b[1] - a[1])
.slice(0, k)
.map((i) => i[0])
};
文章介绍了如何使用单调队列解决LeetCode的239题滑动窗口最大值,以及347题前K个高频元素。在滑动窗口最大值问题中,维护一个单调递减队列,通过push、shift和getMaxValue操作找到每个窗口的最大值。对于高频元素问题,先统计元素频率,然后排序并截取前k个。
301

被折叠的 条评论
为什么被折叠?



