题目描述
有一个N个整数的数组,和一个长度为M的窗口,窗口从数组内的第一个数开始滑动直到窗口不能滑动为上,每次窗口滑动产生一个窗口和(窗口内所有数的和),求窗口滑动产生的所有窗口和的最大值
输入输出
输入
第一行输入一个正整数N。(0<N<100000)
第二行输入N个整数,整数的取值范围为[-100, 100]。
第三行输入一个正整数M,M代表窗口的大小, M<=N,且M<100000。输出
窗口滑动产生窗口和的最大值
示例
输入
6
12 10 20 30 15 23
3输出
68
说明
窗口长度为3,窗口滑动产生的窗口和分别为12+10+20=42, 10+20+30=60,20+30+15=65,30+15+23=68
所以窗口滑动产生的所有窗口和的最大值为68
思路
从题意中可知这道题需要用滑动窗口求解,关于滑动窗口可以参考这篇博文。
滑动窗口的三要素:
- 窗口内是什么? --长度为3的元素之和
- 如何移动窗口的起始位置? – 当满足窗口大小时,窗口就需要向后移动了
- 如何移动窗口的结束位置? – 当窗口的起始位置向后移动一位,则结束位置同样向后移动一位
参考代码
int main(void)
{
int N, M, winCnt;
int sum = 0; // 窗口内所有值的和
int maxVal = -10000000; // 最终要求的最大值,初始值给一个最小的值
int start = 0; // 滑动窗口的起始边界,初始化为0
scanf("%d", &N);
int *arr = (int *)malloc(N*sizeof(int)); // 动态分配num
for (int i = 0; i < N; i++) {
scanf("%d", &arr[i]);
}
scanf("%d", &M);
winCnt = 0;
for(int end = 0; end < N; end++) { // i为滑动窗口的结束边界
winCnt++;
sum += arr[end]; // 求出窗口内的元素之和
if (winCnt == M) { // 当窗口大小满足时,起始边界需要向后移动
maxVal = maxVal > sum ? maxVal : sum; // 求出最大的和
sum -= arr[start++]; // 调整窗口
winCnt--;
}
}
printf("%d", maxVal);
return 0;
}