代码随想录的第十一天
剑指 Offer 59 - I. 滑动窗口的最大值
var maxSlidingWindow = function(nums, k) {
const queue = []
const res = []
for (let i = 0; i < nums.length; i++) {
while (queue.length && queue[0] <= i - k) queue.shift()
while (queue.length && nums[queue[queue.length - 1]] <= nums[i]) queue.pop()
queue.push(i)
if (i >= k - 1) res.push(nums[queue[0]])
}
return res
};
思路:
1、维护一个队列
2、队列最多放置k个数字,超出后,将数组的第一位弹出
3、队列的新加的数字要大于队列的末尾的数字,就将队列的末尾数字进行弹出,直到保证新加的数字前都是大于他的数字
4、这样就能保证在第一位的永远是最大的那个数字
347. 前 K 个高频元素
var topKFrequent = function(nums, k) {
const map = new Map()
for (let i = 0; i < nums.length; i++) {
if (map.has(nums[i])) {
map.set(nums[i], map.get(nums[i]) + 1)
} else {
map.set(nums[i], 1)
}
}
const arr = [...map.entries()].sort((a, b) => {
return b[1] - a[1]
}).splice(0, k).map(item => item[0])
return arr
};
哈希表思路:
1、将数组的值和出现的次数存起来
2、将存起来的数组根据出现的次数进行排序
3、然后截取前k个,然后获取他的值进行返回
map+小顶堆思路:二刷的时候补充