slide windows&双指针
1..............
重you小垃
这个作者很懒,什么都没留下…
展开
-
slide window总结
自己的模板:还款机制原创 2022-06-03 09:21:04 · 361 阅读 · 0 评论 -
leetcode3 无重复的最长子串(中等)
class Solution {public: int lengthOfLongestSubstring(string s) { //总结: //unorder_map 不排序,速度更快 //求连续子数组,子串想到到滑动窗口,这道题子串的长度变所以窗口长度变 //左窗口left更新的值为重复字符(下标大于等于left)的后一个位置 //left == right时长度为0 //先单独考虑空串 ..原创 2020-11-27 20:40:01 · 62 阅读 · 0 评论 -
leetcode75.颜色分类/荷兰国旗问题(中等)
自己的思路(循环两遍)循环一遍,记录0 1 2各自的个数,然后在循环一遍进行赋值先回顾一下二切分问题的解法->单指针(数组访问一遍)一个指针指向开头,依次遍历每个元素,如果是0则与指针位置的值交换并且指针后移官方解法1->单指针(数组访问两遍)使用二切分两次:先把0归位,再把1归位,最后2的位置就好了class Solution {public: void sortColors(vector<int>& nums) { //单指针写法..原创 2021-10-09 22:13:20 · 87 阅读 · 0 评论 -
leetcode283.移动零(荷兰国旗,简单)
思路:二切分问题(类似荷兰国旗,用单指针就好)class Solution {public: void moveZeroes(vector<int>& nums) { //2切分问题 int index = 0, n = nums.size(); for (auto& m : nums) { if (m != 0) swap(m, nums[index++]); } }.原创 2021-11-10 08:34:57 · 54 阅读 · 0 评论 -
leetcode220. 存在重复元素 III(中等,难题)
思路:滑窗 +有序集合具体思路:维护一个长度为k+1,abs(nums[i] - nums[j])原创 2022-06-07 10:02:54 · 158 阅读 · 0 评论 -
leetcode395. 至少有 K 个重复字符的最长子串(中等,难题)
思路:滑窗 O(26*n)窗口维护:字符个数可以,乘积 || 和可以,字符个数超过m可以;想法一:但是这道题想维护每个字符都超过m?不行,这样的话右边界不断右移,希望获得更长(为了满足所有的字符),因此slide windows失效(发现r增加时,l不一定增加,因此滑窗不可做)想法二:看到最长子串,二分?长度为m的满足长度为m-1的不一定满足,因此也不具备二分的特点想法三:如何按照想法一固定滑窗?解决办法:窗口内只包括m个字符来固定窗口边界+个数大于等于k的字符==m->满足题意。具体思路:这道题原创 2022-06-06 20:27:57 · 104 阅读 · 0 评论 -
leetcode1438. 绝对差不超过限制的最长连续子数组(中等,难题)
思路一:滑动窗口+有序集合 O(nlogn)具体思路:multiset维护滑动窗口内的值。思路二优化:滑动窗口+单调队列 O(n)维护两个单调队列:单调递增+单调递减,将查找的复杂度降到O(1),但是代码不太好写。......原创 2022-06-04 17:54:05 · 109 阅读 · 0 评论 -
leetcode424. 替换后的最长重复字符(中等,难题)
思路:最长子字符串->滑动窗口q1:怎么保证窗口内最多非最多字符ch的个数小于等于k?a1:不用保证,换个思路:_max保存历史窗口内出现个数的最大值即可,当ch出现个数>k时,窗口整体右移一个位置(l++ r++),此时窗口内ch的个数可能大于k,但是对ans并不会产生贡献,除非后面遇到窗口内会出现某个字符个数大于_max,此时窗口长度+1,因此移动过程中窗口是一个变大的窗口。2:当k==0时,退化为s中最大连续子字符串。3:r移动到n时,l到n-1是最大的滑动窗口长度。代码:1:s由大写字母原创 2022-06-04 17:01:45 · 85 阅读 · 0 评论 -
leetcode1423. 可获得的最大点数(中等)
思路:滑动窗口优化:post和pre两个变量记录,空间优化到O(1)原创 2022-06-04 10:37:10 · 100 阅读 · 0 评论 -
leetcode904. 水果成篮(中等)
思路:最大连续子数组->slide windows具体思路:slide window始终维护两种水果原创 2022-06-04 10:27:54 · 81 阅读 · 0 评论 -
leetcode978. 最长湍流子数组(中等)
思路:最大连续子数组->slide windows具体思路:flag[r] == 0: l = rflag[r] == 1 && flag[r - 1] == -1:l不动flag[r] == -1 && flag[r - 1] == 1:l不动其他:l = r - 1原创 2022-06-04 10:15:51 · 58 阅读 · 0 评论 -
leetcode713. 乘积小于 K 的子数组(中等)
思路:滑动窗口细节:当nums[i] >= k时,l 移动到r+1即可,表示以nums[i]结尾的子数组长度为0时才满足= l,不然的话l可能会出现比 r 大很多原创 2022-06-03 23:03:42 · 72 阅读 · 0 评论 -
leetcode187. 重复的DNA序列(中等)
思路:长度为10+子数组->固定滑动窗口细节:1.怎么比较两个字符串相等?也就是如何映射?方法一:字符串hash方法二:由于只有4个字符,因此用两个位表示一个字符,10个字符需要20位,int可以表示出该字符串。A:0 C:1 G:2 T:3右边界添加一个字符:flag ......原创 2022-06-03 22:42:59 · 145 阅读 · 0 评论 -
leetcode219. 存在重复元素 II(简单)
思路:hash 记录上一次出现的位置易错点:if (k == 0) return false; 而不是true;原创 2022-06-02 21:00:20 · 60 阅读 · 0 评论 -
leetcode1052. 爱生气的书店老板(中等)
思路:固定滑动窗口具体:窗口内维护:窗口内可增加的顾客数原创 2022-06-03 21:09:40 · 81 阅读 · 0 评论 -
leetcode1004. 最大连续1的个数 III(中等)
思路一:滑动窗口 O(n)具体思路:区间内保持0的数目小于等于k (l, r], 区间是左开右闭,cntl记录l左边0的个数, cntr记录右边0的个数易错点:开始的区间也要考虑思路二:枚举+二分 O(nlogn)具体细节:nums[]为前缀和,区间和即为区间内0的个数(因为是翻转0,所以要计算出区间内0的个数:1-nums[i])枚举:以nums[i]结尾的最长长度为:找到最左端下标j,[j,i]之间0的个数.........原创 2022-06-03 11:58:37 · 81 阅读 · 0 评论 -
leetcode76.最小覆盖子串(困难)
双指针经典题目,可以看一下leetcode.209自己的思路:记录出s中每个字符后面该字符的位置,当left指针移动之后,导致窗口内少了一个字符,right直接移动到left之前指向的那个字符。自己的思路存在的问题: 注意题目中t的字符是可重复的,如果不重复的话才可以这样做!官方思路:双指针。难点:1:如何判断right移动后的的窗口是否包含了t中所有的字符?可以设置两个hash表(窗口内t中的字符搞一个, t搞一个),对这两个hash表逐个比较,如果存在一个字符,s_hash(该字符...原创 2021-10-19 11:01:09 · 95 阅读 · 0 评论 -
剑指 Offer 61. 扑克牌中的顺子(简单)
思路:由于要构成连续的长度为5,所以相当于滑动窗口。细节:step1:除去0之外,不能有重复的数字。step2:其次,最大值减去最小非0值的差值<5才可以class Solution {public: bool isStraight(vector<int>& nums) { sort(nums.begin(), nums.end()); int cnt0 = 0; for (int i = 0;..原创 2022-05-12 11:29:14 · 136 阅读 · 1 评论 -
剑指 Offer II 019. 最多删除一个字符得到回文(简单)
思路:双指针,将复杂度降到O(n)具体思路:l=0 r=n-1 如果s[l]==s[r]则l++;r–; 否则只要s[l+1,r]或者s[l,r-1]是回文即可class Solution {public: bool valid(const string &s, int l, int r) { while (l < r) { if (s[l] != s[r]) return false; l++;r--; ..原创 2022-04-23 10:02:41 · 161 阅读 · 0 评论 -
leetcode 30 串联所有单词的子串( 困难)
class Solution {public: vector<int> findSubstring(string s, vector<string>& words) { //窗口的长度是固定的 //因为words中每个单词是固定的长度,所以可以把每个单词看成一个整体,每次从当前窗口中移动固定的距离,看一下是否包含了所有的words即可,用map保存每个单词的数目 vector<int> result; ..原创 2020-11-27 22:14:54 · 145 阅读 · 0 评论 -
leetcode 209.长度最小的子数组(中等)
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。示例:输入:s = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。思路:通过之前的分析,用二分,返回R。代码如下:class Solution {public: //二分查找两个函数用就可以,主函数上面写二分的操作即可 //二分查找的题目注意边界:nu原创 2020-11-02 19:53:45 · 140 阅读 · 0 评论 -
leetcode438.找到字符串中所有的字母异位词(中等)
自己的思路:滑动窗口,维护一个长度为p.size()的窗口,hash保存该窗口内各个字符出现的个数,与p数组比较,比较结果一致的存储到ans中。class Solution {public: vector<int> findAnagrams(string s, string p) { int n = s.size(), m = p.size(); vector<int> ans; if (n < m) retu...原创 2021-12-31 17:42:00 · 354 阅读 · 0 评论