首先需要知道的是,滑动串口是使用双指针实现的。
1 例一:T209 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums)
{
int i=0;
int sum=0;
int res=INT_MAX;
for(int j=0;j<nums.size();j++)//右侧指针
{
//维护窗口内的状态
sum+=nums[j];
while(sum>=target)//什么时候修改左侧边界
{
//移动左侧边界,并修改窗口内的状态
res=min(res,j-i+1);
sum-=nums[i];
i++;//左侧指针
}
}
return res==INT_MAX?0:res;
}
};
2 例二:T904 水果成篮
//双指针实现的滑动窗口--
//使用滑动窗口的模板即可
//时间复杂度:O(n),空间复杂度O(1)
//需要注意的是,虽然for里面嵌套了while,但是每个元素是被操作了两次--窗口进来一次,出去一次,即2N,所以不是O(N2),而是O(n)
class Solution {
public:
int totalFruit(vector<int>& fruits)
{
int res=0;
int i=0;//左侧边界
//记录窗口内状态的变量
int count=0;
unordered_map<int,int> map;
for(int j=0;j<fruits.size();j++)//右侧边界
{
//窗口内的状态
map[fruits[j]]++;
count++;
while(map.size()>2)//什么时候来移动左侧边界
{
//移动左侧边界,并改变窗口状态
map[fruits[i]]--;
if(map[fruits[i]]==0)
map.erase(fruits[i]);
count--;
i++;
}
res=max(count,res);
}
return res;
}
};
例三:T76覆盖最小的子串