239. 滑动窗口最大值 347.前 K 个高频元素
239. 滑动窗口最大值
leetcode-239.滑动窗口最大值–hard
题目描述 && 测试案例
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
示例 2:
输入:nums = [1], k = 1
输出:[1]
解题思路 && 解题代码
有点难,感觉没全吸收,还要在看几次。
var maxSlidingWindow = function(nums, k) {
class MonoQueue {
queue;
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;
let j = 0;
let resArr = [];
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;
};
347.前 K 个高频元素
题目描述 && 测试案例
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
解题思路 && 解题代码
简单一点想
var topKFrequent = function(nums, k) {
const len = nums.length;
//map一下nums里面的数组key是数组,value是出现的次数
let map = new Map();
//for循环更新一下
for(let i = 0; i < len; i++) {
if(map.has(nums[i])) {
let count = map.get(nums[i])
map.set(nums[i], ++count)
}else{
map.set(nums[i], 1)
}
}
//转为一个二维数组数组,下标为arr[0][]是map的k arr[][0]是v
let arr = Array.from(map)
let res = [];
arr.sort((a,b) => b[1] - a[1]) //根据nums[i]出现的次数排序 k为nums[i]v为count
//取arr的前k个就是出现频率最高的数组
for(let j = 0; j < k; j++) {
res.push(arr[j][0])
}
return res
};