滑动窗口

滑动窗口是一种和双指针密切相关的算法,两个指针指向的元素之间形成一个窗口,这就是滑动窗口。

下面列举几道例题

1.力扣3

题目链接:https://leetcode.cn/problems/longest-substring-without-repeating-characters/

代码:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        map<char,int>mp;int n=s.length();
        int left=0,right=0,ans=0;
        while(right<n){
            mp[s[right]]++;
            if(right-left+1==mp.size()){
                ans=max(ans,right-left+1);
            }
            while(right-left+1>mp.size()){
                mp[s[left]]--;
                if(mp[s[left]]==0)mp.erase(s[left]);
                left++;
            }
            right++;
        }
        return ans;
    }
};

  

2.力扣643

题目链接:https://leetcode.cn/problems/maximum-average-subarray-i/

代码:

class Solution {
public:
    double findMaxAverage(vector<int>& nums, int k) {
        int sum=0,res=INT_MIN,l=0,r=0,n=nums.size();
        while(r<n){
            sum+=nums[r];
            if(r-l+1==k)res=max(res,sum);
            if(r>=k-1){
                sum-=nums[l];
                l++;
            }
            r++;
        }
        return res*1.0/k;
    }
};

  

3.力扣159

题目链接:https://leetcode.cn/problems/longest-substring-with-at-most-two-distinct-characters/

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s;map<char,int>mp;
int main(){
	cin>>s;
	int len=0,l=0,r=0,n=s.length();
	while(r<n){
		mp[s[r]]++;
		if(mp.size()<=2)len=max(len,r-l+1);
		while(mp.size()>2){
			mp[s[l]]--;
			if(mp[s[l]]==0)mp.erase(s[l]);
			l++;
		}
		r++;
	}
	cout<<len;
	return 0;
}

  

4.力扣209

题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/

代码:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int len=INT_MAX,l=0,r=0,n=nums.size(),sum=0;
        while(r<n){
            sum+=nums[r];
            while(sum>=target){
                len=min(len,r-l+1);
                sum-=nums[l];
                l++;
            }
            r++;
        }
        return (len==INT_MAX?0:len);
    }
};

  

5.力扣1695

题目链接:https://leetcode.cn/problems/maximum-erasure-value/

代码:

class Solution {
public:
    int maximumUniqueSubarray(vector<int>& nums) {
        map<int,int>m;
        int ans=0,l=0,r=0,n=nums.size(),sum=0;
        while(r<n){
            sum+=nums[r];
            m[nums[r]]++;
            if(r-l+1==m.size())ans=max(ans,sum);
            while(r-l+1>m.size()){
                sum-=nums[l];
                m[nums[l]]--;
                if(m[nums[l]]==0)m.erase(nums[l]);
                l++;
            }
            r++;
        }
        return ans;
    }
};

  

6.力扣438

题目链接:https://leetcode.cn/problems/find-all-anagrams-in-a-string/

代码:

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        map<char,int>ms,mp;
        for(auto& x:p)mp[x]++;
        vector<int>ret;
        int l=0,r=0,n1=s.length(),n2=p.length();
        while(r<n1){
            ms[s[r]]++;
            if(ms==mp)ret.push_back(l);
            if(r>=n2-1){
                ms[s[l]]--;
                if(ms[s[l]]==0)ms.erase(s[l]);
                l++;
            }
            r++;
        }
        return ret;
    }
};

  

7.力扣567

题目链接:https://leetcode.cn/problems/permutation-in-string/description/

代码:

class Solution {
public:
    bool checkInclusion(string s1, string s2) {
        map<char,int>ms,mp;
        for(auto& x:s1)mp[x]++;
        int l=0,r=0,n1=s1.length(),n2=s2.length();
        while(r<n2){
            ms[s2[r]]++;
            if(ms==mp)return true;
            if(r>=n1-1){
                ms[s2[l]]--;
                if(ms[s2[l]]==0)ms.erase(s2[l]);
                l++;
            }
            r++;
        }
        return false;
    }
};

  

8.力扣76

题目链接:https://leetcode.cn/problems/minimum-window-substring/

代码:

class Solution {
private:
    map<char,int>ms,mp;
public:
    bool check(){
        for(auto& x:mp){
            if(ms[x.first]<x.second)return 0;
        }
        return 1;
    }
    string minWindow(string s, string t) {
        for(auto& x:t)mp[x]++;
        string res;
        int len=INT_MAX,start=-1,l=0,r=0,n=s.length();
        while(r<n){
            ms[s[r]]++;
            while(check()&&l<=r){
                if(r-l+1<=len){
                    len=r-l+1;
                    start=l;
                }
                ms[s[l]]--;
                if(ms[s[l]]==0)ms.erase(s[l]);
                l++;
            }
            r++;
        }
        return (start==-1?"":s.substr(start,len));
    }
};

  

9.力扣713

题目链接:https://leetcode.cn/problems/subarray-product-less-than-k/description/?envType=study-plan&id=suan-fa-ji-chu&plan=algorithms&plan_progress=y00ve32

代码:

class Solution {
public:
    int numSubarrayProductLessThanK(vector<int>& nums, int k) {
        int res=0,sum=1,l=0,r=0,n=nums.size();
        while(r<n){
            sum*=nums[r];
            while(l<=r&&sum>=k){
                sum/=nums[l];
                l++;
            }
            if(sum<k)res+=r-l+1;
            r++;
        }
        return res;
    }
};

  

posted @ 2023-05-21 16:56  天雷小兔  阅读(44)  评论(0)    收藏  举报