文章目录
- 一、题目
- 🎃题目描述
- 🎃输入输出
- 🎃样例1
- 二、思路参考
- 三、代码参考
- 🏆C语言代码
- 作者:KJ.JK
🍂个人博客首页: KJ.JK
🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用C语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习
一、题目
🎃题目描述
有一个N个整数的数组,和一个长度为M的窗口,窗口从数组内的第一个数开始滑动直到窗口不能滑动为止,
每次窗口滑动产生一个窗口和(窗口内所有数的和),求窗口滑动产生的所有窗口和的最大值
🎃输入输出
输入
第一行输入一个正整数N,表示整数个数。(0<N<100000)
第二行输入N个整数,整数的取值范围为[-100,100]。
第三行输入一个正整数M,M代表窗口的大小,M<=100000,且M<=N。
输出
窗口滑动产生所有窗口和的最大值
🎃样例1
输入
6
12 10 20 30 15 23
3输出
68说明窗口长度为3,窗口滑动产生的窗口和分别为10+20+30=60,20+30+15=65,30+15+23=68,15+23+12=50,所以窗口滑动产生的所有窗口和的最大值为68
二、思路参考
- 首先,读取输入的整数个数N和整数数组,以及窗口大小M
- 定义一个变量maxSum,用于记录窗口滑动产生的所有窗口和的最大值,初始值为负无穷大
- 计算初始窗口的和sum,即前M个数的和
- 遍历数组从第M个数开始,每次滑动窗口:
将窗口的第一个数移出窗口,即从sum中减去窗口的第一个数,
将窗口的下一个数添加到窗口中,即将窗口的下一个数加到sum中,更新maxSum,
如果sum大于maxSum,则更新maxSum为sum
5.输出maxSum作为结果
三、代码参考
🏆C语言代码
#include <stdio.h>int main() {int N;scanf("%d", &N);int arr[N];for (int i = 0; i < N; i++) {scanf("%d", &arr[i]);}int M;scanf("%d", &M);int maxSum = -100000; // 初始化为负无穷大int sum = 0;// 计算初始窗口的和for (int i = 0; i < M; i++) {sum += arr[i];}// 窗口滑动,计算所有窗口和的最大值for (int i = M; i <= N; i++) {if (sum > maxSum) {maxSum = sum;}// 窗口滑动:移出窗口的第一个数,加入窗口的下一个数sum -= arr[i - M];sum += arr[i];}printf("%d\n", maxSum);return 0;
}