最小滑窗模板:给定数组 nums,定义滑窗的左右边界 i, j,求满足某个条件的滑窗的最小长度。
while j < len(nums):
判断[i, j]是否满足条件
while 满足条件:
不断更新结果(注意在while内更新!)
i += 1 (最大程度的压缩i,使得滑窗尽可能的小)
j += 1
//209. 长度最小的子数组
int minSubArrayLen(int target, vector<int>& nums) {
int left = 0, right = 0;
int res = INT_MAX;
int sum = 0;
for (int i = 0; i < nums.size(); i++)
{
sum += nums[i];
// 注意这里使用while,每次更新 i(起始位置),并不断比较子序列是否符合条件
while (sum >= target) {
int subLength = (i - left + 1); // 取子序列的长度
res = res < subLength ? res : subLength;
if (res == 1 && sum == target)
{
return res;
}
sum -= nums[left++]; // 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置)
}
}
// 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
return res == INT32_MAX ? 0 : res;
}
最大滑窗模板:给定数组 nums,定义滑窗的左右边界 i, j,求满足某个条件的滑窗的最大长度。
while j < len(nums):
判断[i, j]是否满足条件
while 不满足条件:
i += 1 (最保守的压缩i,一旦满足条件了就退出压缩i的过程,使得滑窗尽可能的大)
不断更新结果(注意在while外更新!)
j += 1
//904. 水果成篮
int totalFruit(vector<int>& fruits) {
//滑动窗口法
int left = 0; //滑动窗口左边界
int sub_len = 0; //子序列长度
int fruit_counter = 0; //篮子中的水果种类数
int len = fruits.size();
unordered_map<int, int> basket; //创建篮子
for (int j = 0; j < len; j++)
{
if (basket[fruits[j]] == 0) //当前水果数量在篮子中数量为零
{
fruit_counter++;
}
basket[fruits[j]]++;
while (fruit_counter > 2)//如果篮子中的水果数目超过两种,则需要移动左边界
{
basket[fruits[left]]--;
//若对应水果key的value变为0,说明篮子里已经没有这种水果了,水果种类要对应变化(注意basket[fruits[left]] == 0即左边的水果数量为0)
if (basket[fruits[left]] == 0)
{
fruit_counter--;
}
left++;
}
sub_len = max(sub_len, j - left + 1);
}
return sub_len;
}
最大滑窗是在迭代右移右边界的过程中更新结果,而最小滑窗是在迭代右移左边界的过程中更新结果
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。