【Leetcode Daily】239滑动窗口最大值
发表于|更新于|力扣日常 | LeetcodeDaily
|总字数:354|阅读时长:1分钟|浏览量:
题目浅析
想查看原题可以点击题目链接。
简单地说,就是给一个数组和一个数字 k,请给出这个数组中,所有连续 k 个数字中最大的那个数。
思路分享
题目其实已经说明了本题的核心就是滑动窗口了,滑动窗口核心的三步就是进入窗口,弹出窗口,记录数据。
但是从窗口中获得最大值的方式可以改进。最暴力的手段是直接遍历其中的 k 个值外(时间复杂度 (n-k+1)*k),那有没有什么办法能简化呢?
一个简单的办法是设置一个变量维护当前窗口的最大值,当该值弹出时再遍历。能够一定程度上减去部分直接遍历的情况,但对于降序的数组等同于最坏情况。
比较高明的手段是通过单调队列,维护队列内队首到队尾降序,答案就取队首。
代码解答(强烈建议自行解答后再看)
- 参考题解
1 | class Solution: |
文章作者: 陆爻齐-LuYaoQi
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LuYaoQi's Blogs!
相关推荐

2025-05-08
【Leetcode Daily】1004最大连续1的个数III
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个由 0 和 1 组成的整数数组,现在最多可以把其中 k 个 0 反转成 1。求反转后最长连续 1 的个数。 思路分享 纯粹的不定长滑动窗口(【Leetcode Daily】3090每个字符最多出现两次的最长字符串),无需多盐。 代码解答(强烈建议自行解答后再看) 陆爻齐的解法 1234567891011121314151617class Solution {public: int longestOnes(vector<int>& nums, int k) { int zero_count = 0; int left = 0; int n = nums.size(); int ans = 0; for (int i = 0; i < n;i++) { zero_count += 1-nums[i]; while(zero_count...

2025-04-24
【Leetcode Daily】1052爱生气的书店老板
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给两个整型数组,以及一个整数 minutes,按某个要求(具体看原题,难以简化),求一个数组在另一个数组和 minutes 约束下的求的最大值。 思路分享 陆爻齐的思路是计算窗口内(也就是冷静的分钟)不满意生气离开的最大值,加上不生气的心情值,再减去所有生气离开的数值得出答案,但由于思想复杂了点,所以略微修改模板结构,也就是下面陆爻齐的答案。 参照灵茶山艾府,其实只要区分开两部分相加即可,然后直接参照模板。这两部分,一个是不生气的值,一个是生气下的值,取生气下最大值即可。这样就不用像上面一样多一次运算。 https://leetcode.cn/problems/grumpy-bookstore-owner/solutions/2751888/ding-chang-hua-dong-chuang-kou-fu-ti-dan-rch7/ 代码解答(强烈建议自行解答后再看) 陆爻齐的解法 12345678910111213141516171819202122232425class Solution...

2025-05-06
【Leetcode Daily】1208尽可能使字符串相等
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给两个字符串,和一个整数变量,求一个最长字符串的长度,使得一个字符串变换为另一个(ASCII码差值),变换的总值在那个整数之内。 思路分享 典型的不定长滑动窗口(【Leetcode Daily】3090每个字符最多出现两次的最长字符串,无需多盐 代码解答(强烈建议自行解答后再看) 陆爻齐的解法 123456789101112131415161718class Solution {public: int equalSubstring(string s, string t, int maxCost) { int curCost = 0; int left = 0; int n = t.size(); int ans = 0; for (int i = 0; i < n; i++) { curCost += abs(s[i]-t[i]); if (curCost...

2025-05-16
【Leetcode Daily】1234替换子串得到平衡字符串
题目浅析 想查看原题可以点击题目链接。 简单地说,给一个由 QWER 四个字母组成的字符串,可以变换其中的子字符串,使得四个字母数量相同,求变换的子字符串的最短长度。 思路分享 不定长滑动窗口的求“至少”应用,思路上基本同【Leetcode Daily】3090每个字符最多出现两次的最长字符串,下面主要讲讲灵茶山艾府在题解中可以借鉴的地方。 https://leetcode.cn/problems/replace-the-substring-for-balanced-string/solutions/2108358/tong-xiang-shuang-zhi-zhen-hua-dong-chua-z7tu/ 一个是数组的初始化,由于 ASCII 码的对应,其实用字符初始化数组数量是可以的,所以就有了int...

2025-05-30
【Leetcode Daily】1248统计优美子数组
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个整数数组和一个整数 k,要求其中所有子数组的数量,不过子数组需要满足一个条件,即其中的奇数的个数恰好为 k。 思路分享 和【Leetcode Daily】930和相同的二元子数组类似的恰好型不定长滑动窗口,不过本题让陆爻齐更深入的思考,越长越合法的左指针的意义。 “众”所周知,我们灵神派的越长越合法类型的解法,是通过累计窗口左指针数值之和计算得出,其意义,除了充当窗口的左侧边界,实质意义可以理解为,窗口左侧满足条件的情况数目,而窗口本身是在遍历右指针情况,这样一来就算是统计了所有情况。 拿第一次满足条件的窗口举例,此时,窗口的左侧还在起点,下标为 0,示意着此前没有满足条件的情况,进入中间的循环,循环的作用是找出不满足条件的边界;如果第一个元素(下标为 0 的那个)恰好是窗口需要的元素,那么左指针右移一步后,因窗口不符合条件而终止循环,此时左指针下标为...

2025-04-28
【Leetcode Daily】1297子串的最大出现次数
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个字符串,求满足要求的子串中,出现最多的次数。该要求为 1. 内部的字母数量小于 maxLetters;2. 整个字符串的长度在 minSize 和 maxSize 之间(闭区间)。 思路分享 该题的难度在于干扰项 maxSize,由于求子串尽可能多的出现,所以该子串的长度必然越小越好,就是 minSize。 就是定长滑动窗口(【Leetcode Daily】1456定长子串中元音的最大数目),有了个字母数量不大于 maxLetters 的限制,再用哈希统计满足要求字符串出现的次数即可。 代码解答(强烈建议自行解答后再看) 陆爻齐的解法 1234567891011121314151617181920212223242526272829class Solution {public: int maxFreq(string s, int maxLetters, int minSize, int maxSize) { vector<int>...
公告
希望你我都能得偿所愿
PS:相对流水账的文章只能在归档找得到
系列文章
