代码随想录算法训练营第第13天 | 239. 滑动窗口最大值 、347.前 K 个高频元素

  1. 滑动窗口最大值 (一刷至少需要理解思路)

之前讲的都是栈的应用,这次该是队列的应用了。
本题算比较有难度的,需要自己去构造单调队列,建议先看视频来理解。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0239.滑动窗口最大值.html

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
var maxSlidingWindow = function(nums, k) {
    const res = [];
    const queue = [0];
    for(let i=1;i<k;i++){
        while(queue.length&&nums[queue[queue.length-1]]<=nums[i]){
            queue.pop();
        }
        queue.push(i);
    }
    res.push(nums[queue[0]]);

    for(let i=k;i<nums.length;i++){
        while(queue.length&&nums[queue[queue.length-1]]<=nums[i]){
            queue.pop();
        }
        queue.push(i);
        while(queue[0] + k <= i){
            queue.shift();
        }
        res.push(nums[queue[0]]);
    }
    return res;
};

347.前 K 个高频元素 (一刷至少需要理解思路)

大/小顶堆的应用, 在C++中就是优先级队列
本题是 大数据中取前k值 的经典思路,了解想法之后,不算难。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0347.前K个高频元素.html

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
var topKFrequent = function(nums, k) {
  const res = [];
  const map = new Map();
  for (let num of nums) {
    map.set(num, (map.get(num) || 0)+1);
  }
  const head = new PriorityQueue({
    compare: (a, b) => a.value - b.value
  })
  for(let [key,value] of map){
    head.enqueue({key,value});
    if (head.size()>k) {
        head.dequeue();
    }
    
  }
  while(head.size()) res.push(head.dequeue().key);
  return res; 
};
posted @ 2024-05-20 23:40  YuanYF6  阅读(3)  评论(0编辑  收藏  举报