0
点赞
收藏
分享

微信扫一扫

滑动窗口.数组

朱悟能_9ad4 2022-01-12 阅读 44

一.滑动窗口是什么?

所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果

二.相关例题:

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);
}
举报

相关推荐

0 条评论