Day13滑动窗口最大值|前 K 个高频元素

文章介绍了如何使用单调队列解决LeetCode的239题滑动窗口最大值,以及347题前K个高频元素。在滑动窗口最大值问题中,维护一个单调递减队列,通过push、shift和getMaxValue操作找到每个窗口的最大值。对于高频元素问题,先统计元素频率,然后排序并截取前k个。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值