打卡第十三天|力扣 239. 滑动窗口最大值 、347.前 K 个高频元素。

239. 滑动窗口最大值

题目链接如下:239. 滑动窗口最大值

经典题目了,主要是队列的使用

以前的是这么做的

学完之后发现另一种做法:

347.前 K 个高频元素

题目链接如下:347. 前 K 个高频元素

我们要用小顶堆,因为要统计最大前k个元素,只有小顶堆每次将最小的元素弹出,最后小顶堆里积累的才是前k个最大元素。

### 关于滑动窗口最大值问题的解法 对于给定的一个整数数组 `nums` 和一个大小为 `k` 的滑动窗口,目标是从左至右遍历该数组并记录每一个滑动窗口中的最大值。一种直观的方法是通过暴力求解来获取每个窗口的最大值,然而这种方法的时间复杂度较高,达到 O((n - k + 1) * k)[^1]。 为了提高效率,可以采用更优的数据结构——单调队列来进行处理。单调队列是一种特殊的双端队列,在这里用于存储当窗口内元素下标的集合,并保持这些下标对应的数值按降序排列[^4]。具体来说: - 当新元素进入窗口时,移除队列中所有小于等于它的元素(因为它们不可能成为后续任何窗口的最大值),再将新的元素加入到队尾; - 如果队首元素已经不在当窗口范围内,则将其弹出; - 此时队首即为当窗口的最大值所在位置; 下面给出基于上述逻辑的具体 Python 实现方式: ```python from collections import deque def maxSlidingWindow(nums, k): result = [] window = deque() for i in range(len(nums)): # 移除不在当窗口范围内的索引 if window and window[0] <= i - k: window.popleft() # 维护单调递减性质 while window and nums[i] >= nums[window[-1]]: window.pop() window.append(i) # 记录结果 if i >= k - 1: result.append(nums[window[0]]) return result ``` 此算法能够在线性时间内完成计算,时间复杂度降低到了 O(n),极大地提高了程序运行效率[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr丶锤子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值