一般使用双坐标实现,l和r,循环控制l和r范围
209
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int l=0;
int r=0;
int sum = 0;
int n = nums.size();
int res = INT_MAX;
while(r<n){ //控制右边位置
sum+=nums[r];
while(sum>=s){ //控制左边位置
res = min(res,r-l+1);
sum-=nums[l];
l++;
}
r++;
}
return res==INT_MAX?0:res;//没有满足条件和空串情况
}
};
3
class Solution {
public:
int s1(string s)
int lengthOfLongestSubstring(string s) {
int l = 0;
int r = 0;
int n = s.size();
int sum = INT_MIN;
set<char>myset;
while(r<n){
while(myset.find(s[r])!=myset.end()){
myset.erase(s[l]);
l++;
sum=max(sum,r-l+1);
}
sum=max(sum,r-l+1);
myset.insert(s[r]);
r++;
}
return sum==INT_MIN?0:sum;
}
};
这里求两个和的位置是为了有没有重复的字母的计算,但是感觉不太自然的感觉,考虑多种方法
1004
滑动窗口表示为可以包括最大翻转长度的最大连续1的范围
class Solution {
public:
int longestOnes(vector<int>& A, int K) {
int l = 0;
int r = 0;
int n = A.size();
int res = 0;
int count = 0;
while(r<n){
count+=A[r]==0; //翻转的次数
while(count>K){
count-=A[l]==0; //超过翻转的次数了,从右边开始减
l++;
}
res = max(res,r-l+1);
r++;
}
return res;
}
};
1280
滑动窗口表示用了最大转换数的最长转换串
class Solution {
public:
int equalSubstring(string s, string t, int maxCost) {
int l = 0;
int r = 0;
int res = 0;
int n = s.size();
int count = 0;
while(r<n){
count += abs(s[r]-t[r]);
while(count>maxCost){
count -=abs(s[l]-t[l]);
l++;
}
res = max(res,r-l+1);
r++;
}
return res;
}
};