滑动窗口
滑动窗口是一种和双指针密切相关的算法,两个指针指向的元素之间形成一个窗口,这就是滑动窗口。
下面列举几道例题
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
代码:
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;
}
};

浙公网安备 33010602011771号