二、数组2(滑动窗口)

二、数组2(滑动窗口)

209. 长度最小的子数组

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        // 滑动窗口
        int l = 0;
        int r = 0;
        int ans = nums.size()+1;  // 记录最小长度
        int sum = nums[l];
        while(l<nums.size()){
            if(sum<target && r<nums.size()-1){
                ++r;
                sum += nums[r];
            }
            else{
                sum -= nums[l];
                ++l;
            }
            if(sum>=target){
                ans = min(ans, (r-l+1));
            }
        }

        if(ans==nums.size()+1)
            return 0;
        return ans;
    }
};

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

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.empty())
            return 0;
        // 滑动窗口
        int freq[256] = {0};  // 记录字符出现的次数

        int ans = 0;
        int l = 0;
        int r = -1;
        while(l<s.size()){
            if(r+1<s.size() && freq[s[r+1]]==0){
                ++r;
                ++freq[s[r]];
            }
            else{
                --freq[s[l]];
                ++l;
            }
            ans = max(ans, (r-l+1));
        }

        return ans;
    }
};

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

class Solution {
public:
    // 滑动窗口
    bool isSame(const vector<int>& freq_p, const vector<int>& freq_s){
        for(int i=0; i<26; ++i){
            if(freq_p[i] != freq_s[i])
                return false;
        }
        return true;
    }
    vector<int> findAnagrams(string s, string p) {
        vector<int> freq_p(26, 0);
        vector<int> freq_s(26, 0);
        vector<int> ans;

        // 先确定q中字母出现的次数
        for(int i=0; i<p.size(); ++i)
            ++freq_p[p[i]-'a'] ;
        
        // 在s中使用大小为len_p的窗口进行判断是否为字母异序词
        int l = 0;
        int r = -1;
        while(r+1 < s.size()){
            ++r;
            ++freq_s[s[r]-'a'];

            if(r-l+1>p.size()){
                --freq_s[s[l]-'a'];
                ++l;
            }

            if(r-l+1==p.size() && isSame(freq_p, freq_s)){
                ans.push_back(l);
            }

        }

        return ans;

    }
};

76. 最小覆盖子串

暂时不会呀!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值