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])
};