代码随想录的第十一天

122 阅读1分钟

代码随想录的第十一天

剑指 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+小顶堆思路:二刷的时候补充