同向双指针合集(力扣)

209. 长度最小的子数组

##代码

复制代码
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {   
        int n = nums.size();
        int ans = n + 1;
        int sum = 0;
        int left = 0, right = 0;
        for(right = 0; right < n; right++){
            sum += nums[right];
            while(sum - nums[left] >= target){
                sum -= nums[left];
                left++;
            }
            if(sum >= target) ans = min(ans, right - left + 1);
        }
        if(ans == n + 1) return 0;
        return ans;
    }
};

乘积小于 K 的子数组

##代码

复制代码
class Solution {
public:
    int numSubarrayProductLessThanK(vector<int>& nums, int k) {
        int n = nums.size();
        if(k <= 1) return 0;//严格小于1的只有0和负整数,不成立
        int ans = 0, sum = 1, left = 0, right = 0;
        for(right = 0; right < n; right++){
            sum *= nums[right];
            while(sum >= k){
                sum /= nums[left];
                left++;
            }
            ans += right - left + 1;
        }
        return ans;
    }
};

3. 无重复字符的最长子串

##代码

复制代码
class Solution {
public:
//空格 常见字符最小的ascii码
    int cnt[330];
    int lengthOfLongestSubstring(string s) {
        int maxnum = 0, l = 0;
        for(int r = 0; r < s.size(); r++){
            if(cnt[s[r] - ' '] > 0){
                while(cnt[s[r] - ' '] > 0){
                    cnt[s[l] - ' ']--;
                    l++;
                }
            }
            maxnum = max(maxnum, r - l + 1);
            cnt[s[r] - ' ']++;
        }
        return maxnum;
    }
};

438. 找到字符串中所有字母异位词

##代码

复制代码
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int n = p.size();
        map<char,int>mp;
        for(auto i : p)mp[i]++;
        int left = 0;
        vector<int>ans;
        n = s.size();
        for(int right = 0 ; right < n; right++){
            mp[s[right]]--;
            while(mp[s[right]] < 0){
                mp[s[left]]++;
                left++;
            }
            if(right - left + 1 == p.size())ans.push_back(left);//因为子串是连续的,且上面处理了非子串的字符必定无法包含进去
        }
        return ans;
    }
};

76. 最小覆盖子串

##代码

复制代码
class Solution {
public:
    
    string minWindow(string s, string t) {
        map<char,int>cnt;
        int num = 0;
        for(auto i : t){
            if(!cnt[i]) num++;//记录字符串里不同字符的种类数
            cnt[i]++;
        }
        int count = 0, l = 0;
        string tp ="";
        int minnum = 100010;
        for(int r = 0; r < s.size();r++){
            cnt[s[r]]--;
            if(cnt[s[r]] == 0) count++;//记录已匹配的字符数
            if(count == num){
                while(cnt[s[l]] < 0){
                    cnt[s[l]]++;
                    l++;
                }
                if(r - l + 1 < minnum){
                    minnum = r - l + 1;
                    tp = s.substr(l,minnum);
                }
                cnt[s[l]]++;
                count--;
                l++;
            }
        }
        return tp;
    }
};

同向双指针,除了因题目而进行的一些条件的特判外,往往是

  1. l r 从起点出发,移动右指针r
  2. 移动的过程中根据题目条件对左指针进行移动,从而使得特殊情况也满足条件
  3. 根据题目要求的结果,对需要输出的最大长度/子串/起始点进行判断,因为特殊情况也提前被我们处理为了满足条件的情况,所以往往单独放在for循环体的最后进行统计即可。
相关推荐
Christo33 分钟前
TFS-2022《A Novel Data-Driven Approach to Autonomous Fuzzy Clustering》
人工智能·算法·机器学习·支持向量机·tfs
木木子99997 分钟前
超平面(Hyperplane)是什么?
算法·机器学习·支持向量机·超平面·hyperplane
星空下的曙光2 小时前
React 虚拟 DOM Diff 算法详解,Vue、Snabbdom 与 React 算法对比
vue.js·算法·react.js
♞沉寂2 小时前
数据结构——双向链表
数据结构·算法·链表
大阳1232 小时前
数据结构2.(双向链表,循环链表及内核链表)
c语言·开发语言·数据结构·学习·算法·链表·嵌入式
掘根2 小时前
【Redis】string字符串
数据结构·数据库·redis
CUC-MenG3 小时前
2025牛客多校第六场 D.漂亮矩阵 K.最大gcd C.栈 L.最小括号串 个人题解
c语言·c++·算法·矩阵
2401_876221343 小时前
Tasks and Deadlines(Sorting and Searching)
c++·算法
jie*3 小时前
小杰数据结构——题库——拂衣便欲沧海去,但许明月随吾身
数据结构·windows·python
我要学习别拦我~4 小时前
逻辑回归建模核心知识点梳理:原理、假设、评估指标与实战建议
算法·机器学习·逻辑回归