一.滑动窗口是什么?
所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。
二.相关例题:
1.
209.长度最小的子数组
题目链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum/
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,
并返回其长度。如果不存在符合条件的子数组,返回 0。
示例:
输入:s = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
#include<stdio.h>//滑动窗口
#include<string.h>
int main()
{
int i=0,j,s,nums[10];
int min=10;//滑动窗口长度最大值
int sum = 0; // 滑动窗口数值之和
int k = 0; // 滑动窗口起始位置
int length= 0; // 滑动窗口的长度
scanf("%d",&s);
while(scanf("%d",&nums[i])!=EOF)
{
i++;
}
for(j=0;j<i;j++)
{
sum=sum+nums[j];
while(sum>=s)
{
length=j-k+1;
if(length<min)
min=length;
sum=sum-nums[k++];//起始位置移动,移到最后不动,length-k为当前最小长度
}
}
printf("%d",min);
return 0;
}
2.
1456. 定长子串中元音的最大数目
给你字符串 s 和整数 k 。
请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。
英文中的 元音字母 为(a, e, i, o, u)。
示例 1:
输入:s = "abciiidef", k = 3
输出:3
解释:子字符串 "iii" 包含 3 个元音字母。
示例 2:
输入:s = "aeiou", k = 2
输出:2
解释:任意长度为 2 的子字符串都包含 2 个元音字母。
示例 3:
输入:s = "leetcode", k = 3
输出:2
解释:"lee"、"eet" 和 "ode" 都包含 2 个元音字母。
示例 4:
输入:s = "rhythms", k = 4
输出:0
解释:字符串 s 中不含任何元音字母。
示例 5:
输入:s = "tryhard", k = 4
输出:1
提示:
1 <= s.length <= 10^5
s 由小写英文字母组成
1 <= k <= s.length
#include<stdio.h>
#include<string.h>
int main()
{
int sum1;
char s[100000];
int a[100000];
int k,length;
int i,j;
int sum=0;
gets(s);
length=strlen(s);
scanf("%d",&k);
/* 搞个数组来存,1表示元音,0表示辅音 */
for(i=0;i<length;i++)
if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u')
a[i]=1;
else
a[i]=0;
/*计算第一个窗口*/
for(i=0;i<k;i++)
{
sum=sum+a[i];
}
sum1=sum;
/*滑动窗口*/
for(i=k;i<length;i++)
{
sum=sum+a[i]-a[i-k];//去头加尾
if(sum>=sum1)
sum1=sum;
}
printf("%d",sum1);
}