
滑动窗口
algsup
这个作者很懒,什么都没留下…
展开
-
leetcode刷题总结之滑动窗口
前言:这段时间课比较多,每天还要准备6级,所以题刷的有点慢。leetcode关于滑动窗口的题有20道,其中只有14道免费题,所以我就做了免费题啦。然后总结一下套路,以后复习用。滑动窗口思想:1)2)3)...原创 2019-10-31 16:47:25 · 6570 阅读 · 1 评论 -
[滑动窗口]leetcode6156:得到 K 个黑块的最少涂色次数(easy)
【代码】[滑动窗口]leetcode6156:得到 K 个黑块的最少涂色次数(easy)原创 2022-08-21 21:12:07 · 392 阅读 · 0 评论 -
[滑动窗口]leetcode2106:摘水果(hard)
代码】[滑动窗口]leetcode2106摘水果(hard)原创 2022-07-16 11:12:39 · 254 阅读 · 0 评论 -
[队列][滑动窗口]剑指 Offer II 041. 滑动窗口的平均值(medium)
思路用队列模拟窗口,一旦窗口内的元素超过n,则将队头出队。同时为了避免重复计算,用sum记录窗口内值的总和。原创 2022-07-16 09:32:03 · 241 阅读 · 0 评论 -
[滑动窗口][栈]leetcode2273:移除字母异位词后的结果数组(easy)
题目:题解:思路1:滑动窗口使窗口每次滑动到下一个异位词即可,每次添加该窗口内的第一个字符串即可思路2:栈用栈来模拟相邻元素之间的删除操作,枚举字符串数组中的每个元素的时候,每次和栈顶元素比较是否为异位词,如果不是异位词就进行入栈操作。枚举结束后,栈中所有元素就是不相邻的所有异位词了。代码如下:// 思路 1 代码class Solution {public: vector<string> removeAnagrams(vector<stri原创 2022-05-19 14:55:14 · 186 阅读 · 0 评论 -
[倒序滑动窗口]leetcode2156:查找给定哈希值的子串(medium)
题目:题解:由于使用了取模运算,除法应该采用乘法逆元实现,在mod不保证为质数情况下非常不优。因此我们需要使用倒序滑动窗口,维护大小为 k 的窗口内的 hash 值即可。代码如下:using LL = long long;class Solution {public: string subStrHash(string s, int pow, int mod, int k, int val) { int n=s.size(); // p用来保存p原创 2022-02-01 10:03:22 · 260 阅读 · 0 评论 -
[滑动窗口][单调队列]leetcode1438:绝对差不超过限制的最长连续子数组(medium)
思路2:双指针+两个单调队列。原创 2022-01-20 12:24:32 · 604 阅读 · 0 评论 -
[滑动窗口]leetcode220:存在重复元素 III(medium)
题目:思路:对于条件 abs(i - j) <= k :毋庸置疑,我们需要用 set 维护一个下标差值为 k 的滑动窗口,即大小为 k+1 的滑动窗口。对于条件 abs(nums[i] - nums[j]) <= t:如何思考在窗口内是否存在这样得一对元素满足条件呢?我想这也是本题的难点,首先将问题一步步化简。去掉绝对值:-t=<y-x<=t;移项:-t+x<=y<=t+x。这样问题逐渐清晰起来,我们扩展窗口右边界时,右边界所指向的元素 x,我们需要判断窗原创 2022-01-20 11:34:33 · 482 阅读 · 0 评论 -
[滑动窗口][哈希表]leetcode219:存在重复元素 II(easy)
题目:题解:思路一:纯哈希表做建立 元素值->下标值得映射,遇到相同的元素值,只需判断下标值之差是否小于等于k即可,若满足情况,则直接返回 true,不然就更新相同元素值的下标为现在这个下标,这样可保证 i-j 尽可能地小。思路2:滑动窗口维护一个下标差值为 k 的滑动窗口,其大小为 k+1,用 set 作为窗口的数据结构,若窗口内存在重复值,表示找到符合题目条件的两个元素了,不然继续扩展窗口,直到遍历结束。代码如下:class Solution {public:原创 2022-01-20 10:50:44 · 394 阅读 · 0 评论 -
[滑动窗口]leetcode713:乘积小于k的子数组(medium)
题目:题解:思路:常规的滑动窗口模板题,唯一需要注意的是每次都需要统计窗口的大小。因为每次让left移动完成后,[left,right]这个连续子数组里面以right结尾的子序列都满足乘积值小于k,因此用right-left+1以right结尾的子序列的个数。代码如下:class Solution {public: int numSubarrayProductLessThanK(vector<int>& nums, int k) { //原创 2022-01-04 12:02:09 · 550 阅读 · 0 评论 -
[滑动窗口]leetcode1438:绝对差不超过限制的最长连续子数组(medium)
题目:题解:滑动窗口裸题,关键点在于如何想到将 该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 转换为 利用 mutiset 的自动排序功能来计算窗口内最大值和最小值之间的差值与 limit 的关系来扩大或缩小窗口,进而更新 res。代码如下:class Solution {public: int longestSubarray(vector<int>& nums, int limit) { multiset<int&原创 2021-02-21 09:39:20 · 226 阅读 · 0 评论 -
[滑动窗口]leetcode1759:统计同构子字符串的数目(medium)
题目:题解:本题稍微推导了一下,就是一个滑动窗口裸题,直接用窗口统计连续相同字符的子字符串的长度len,然后稍微推导下同构子字符串的个数为len*(len+1)/2。代码如下:const int mod = 1e9+7;typedef long long LL;class Solution {public: // 题解:滑动窗口裸题,统计每个窗口内的连续字符相同的长度len,同构子字符串的个数为len*(len+1)/2 int countHomogenous(s原创 2021-02-14 20:23:12 · 267 阅读 · 0 评论 -
[滑动窗口]面试题57 - II. 和为s的连续正数序列(easy)
题目:题解:一看数据量10^5,话不多说,直接滑动窗口,O(n)O(n)O(n)的时间复杂度实现双100。代码如下:class Solution {public: //题解:滑动窗口 vector<vector<int>> findContinuousSequence(int target) { vector<vec...原创 2020-03-06 10:07:27 · 294 阅读 · 2 评论 -
[滑动窗口]leetcode187:重复的DNA序列(medium)
题目:题解:滑动窗口我们需要用hashmap存放<10个字符的字符串,该字符串的数量>。滑动窗口:下标i从0开始,每次取10个字符作为窗口字符串,判断窗口的字符串是否出现2次然后确定是否添加到res,注意这里只需要判断2次,因为这样可以避免重复添加相同的字符串。i+9<size表示从i起包括i有10个字符,最终取不到10个字符结束循环。代码如下:class ...原创 2019-12-23 15:43:01 · 318 阅读 · 0 评论 -
[滑动窗口]leetcode443:压缩字符串(easy)
题目:443. 压缩字符串题解:思路一:原始最暴力的方法,直接遍历字符串,然后建立压缩字符串,然后赋给原始字符串思路二:滑动窗口法,注意原始字符串没有删除字符,而是用压缩后字符串覆盖了前半部分,后面的字符串没有删除代码如下:class Solution {public: //思路1:非原地算法,获得压缩的新字符串然后赋给原始字符串 int compr...原创 2019-12-04 15:59:50 · 244 阅读 · 0 评论 -
[滑动窗口]leetcode3:无重复字符的最长子串(medium)
题解:题解1:利用set来判断重复字符class Solution {public: int lengthOfLongestSubstring(string s) { /*题解:把出现过的字符都放入set中,遇到set中没有的字符就加入set中并更新结果res,如果遇到重复的,则从左边开始删字符,直到删到重复的字符停止*/ set<char&g...原创 2019-08-19 10:44:11 · 861 阅读 · 0 评论 -
[滑动窗口]leetcode76:最小覆盖字串(hard)
题目:题解:labuladong的深入浅出滑动窗口讲法,大家可以看看那个详细解法,我这里提供两份代码,一份是详细解法的代码,一份是8ms,战胜 98.87 %的代码。代码如下:class Solution {public: string minWindow_1(string s, string t) { //最小字串的开始位置和最小长度 in...原创 2019-10-11 21:19:12 · 634 阅读 · 0 评论 -
[滑动窗口]leetcode30:串联所有单词的字串(hard)
题目:题解:滑动窗口1)先求出一个word的长度one_word和words中的单词数word_num,以及建立单词->单词个数的hashmap表m1。2)然后以one_word为步长,开始寻找s中的子串,窗口每次移动one_word的长度,若新匹配的单词不在m1中,则重置窗口的边界(也就是left滑到right的位置,子串建立hashmap表m2需要清零,匹配到的单词个数co...原创 2019-10-14 21:15:46 · 284 阅读 · 0 评论 -
[滑动窗口+双向队列]leetcode239:滑动窗口最大值(hard)
题目:题解:解法1:暴力法+滑动窗口。left、right分别表示窗口的左右边界,当窗口的大小为k(right-left+1=k)时,用max_element()求出窗口内的最大值添加到result即可,然后遍历数组,直到right=nums.size()时遍历结束,返回result。解法2:双向队列+滑动窗口。duque用来存放窗口window的下标,并保持窗口头部的下...原创 2019-10-12 23:52:03 · 707 阅读 · 0 评论 -
[滑动窗口]leetcode424:替换后的最长重复字符(medium)
题目:题解:滑动窗口这个问题的难点在于如何思考替换后的最长重复字符,我们需要建立一个窗口用来保存s中的子字符串,因为可以替换的字符就是当前窗口的大小减去窗口中数量最多的字符的数量。...原创 2019-10-16 09:05:12 · 796 阅读 · 0 评论 -
[滑动窗口]leetcode438:找到字符串中的所有字母异位词(medium)
题目:题解:本题使用滑动窗口解题,滑动窗口属于双指针技巧的最高境界了,本题求的是模式串p在总串s中的所有字母异位词,所以我们所建立的窗口windows大小维持在与模式串p生成的字符表needs的大小相等即可,关于更多滑动窗口详解:看这里。代码如下:class Solution {public: vector<int> findAnagrams(string s,...原创 2019-10-11 20:06:00 · 572 阅读 · 1 评论 -
[滑动窗口]leetcode480:滑动窗口中位数(hard)
题目:题解:滑动窗口本题是滑动窗口的练手题,难点在于如何快速求出窗口大小为k的中位数?1)对于暴力法,将窗口内所有数sort排序后,根据size的奇偶求出中位数的时间复杂度为O(nlogn),在大数据量时必然导致超时,也就是我只过了31/44的用例。2)超时代码:代码如下:class Solution {public: vector<double>...原创 2019-10-17 19:41:16 · 869 阅读 · 1 评论 -
[滑动窗口]leetcode567:字符串的全排列(medium)
题目:题解:本题属于438.找到字符串中的所有字母异位词的子题,前者是找到所有异位词并添加异位词出现的下标,而本题比前者简单多了,若在总串找到模式串的异位词,直接返回ture就行了;若遍历完整个总串也没找到模式串的异位词,返回false就行。代码如下:class Solution {public: bool checkInclusion(string s1, string ...原创 2019-10-17 21:21:11 · 299 阅读 · 0 评论 -
[滑动窗口]leetcode992:K个不同整数的子数组(hard)
题目:题解:本题的难点在于思考[1,2,1,2,3]中的[2,1],[2,1,2],[1,2]这些子数组是如何求出来的,对于[1,2],[1,2,1],[1,2,1,2],[2,3]这些子数组求解可以利用window的size为k时求出。当window的size等于k时,也就是window内有k个不同的整数,我们求出[left,right]这个区间的窗口内还有多少个满足题目条件的子数组。...原创 2019-10-19 14:29:09 · 685 阅读 · 0 评论 -
[滑动窗口]leetcode995:K连续位的最小翻转次数(hard)
题目:题解:首先我们可以知道,对于每个位置而言,只有初始状态和总共被反转了多少次决定了自己最终的状态。另一方面,我们知道每一个长度为K的区间,最多只会被反转一次,因为两次反转后对最终结果没有影响。基于此,我们从前往后遍历数组,如果遇到一个0,我们将当前位置开始的长度为k区间的区间反转。如果遇到0时,剩下的区间长度不足K说明我们没有办法完成反转。但是如果我们每次反转当前区间时,将区间内每个...原创 2019-10-19 16:21:07 · 624 阅读 · 0 评论 -
[滑动窗口][dp]leetcode978:最长湍流子数组(medium)
题目:题解1:滑动窗口题目重点语句:如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。通俗点解释就是<、>、<、>要交替出现,不能出现连续的>、>或<、<或>、=或<、=。对于本题例子9 4 2 10 7 8 8 1 9,我们用-1,0,1来b表示两个数字之间的符号(小于,等于,大于),也就是说n个数字将产生n...原创 2019-10-18 21:58:53 · 515 阅读 · 0 评论 -
[滑动窗口]leetcode1004:最大连续1的个数 III(medium)
题目:题解:本题与424. 替换后的最长重复字符一样的套路,不过更为简单一点,直接用count统计窗口内的0的个数。当窗口内0的个数大于K时,我们需要缩小窗口;当窗口内0的个数小于等于k时,我们就可将窗口大小来与result来进行比较来确定是否更新result了。注:窗口内0的个数就是表示可以被1替换的个数!代码如下:class Solution {public: i...原创 2019-10-19 22:47:28 · 306 阅读 · 0 评论 -
[滑动窗口]leetcode1040:移动石子直到连续Ⅱ(medium)
题目:1040. 移动石子直到连续 II题解:滑动窗口代码如下:class Solution {public: vector<int> numMovesStonesII(vector<int>& stones) { sort(stones.begin(),stones.end()); in...原创 2019-10-24 18:47:00 · 859 阅读 · 0 评论 -
[滑动窗口]leetcode1052:爱生气的书店老板(medium)
题目:题解:滑动窗口思想对于不生气的人数我们需要全部加上,我们的滑动窗口用来统计窗口大小为X内的不生气人数,然后需要记录所有窗口中最多的生气人数,最后结果就是不生气人数加上所有窗口中最多的生气人数。举例:customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], X = 3。不生气的顾客:[1,0,1,2,1,1,7,5]有1...原创 2019-10-25 20:55:28 · 428 阅读 · 0 评论 -
[滑动窗口]leetcode1074:元素和为目标值的子矩阵数量(hard)
题目:题解:滑动窗口(扫描线)主要思路:对于每一行计算前缀和,对于每一列计算行累加和,然后这个问题就变成和目标和子数组相同了。算法步骤:1)排除特殊情况,初始化行、列、存放结果的值2)然后我们计算每一行的前缀和3)接下来就是利用滑动窗口来进行扫描了,固定i,然后移动j,来寻找target值。注:这里的i和j表示是每一列。代码如下:class Solution {pr...原创 2019-10-31 16:20:58 · 504 阅读 · 0 评论 -
[滑动窗口]leetcode1208:尽可能使字符串相等(medium)
题目:题解:本人leetcode题解滑动窗口:窗口表示t和s的相对应的子字符串做差值之后的cost。若窗口内的cost小于等于maxCost时,我们需要记录最长的子字符串;若cost大于maxCost的话,表示窗口溢出,我们需要缩小窗口了。代码如下:class Solution {public: int equalSubstring(string s, string ...原创 2019-10-25 21:46:46 · 438 阅读 · 0 评论