✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)
文章目录
- 1. 题目描述
- 2. 输入描述
- 3. 输出描述
- 4. Java算法源码
- 5. 测试
- 6.解题思路
1. 题目描述
有一个N个整数的数组,和一个长度为M的窗口,窗口从数组内的第一个数开始滑动直到窗口不能滑动为止,每次窗口滑动产生一个窗口和(窗口内所有数和和),求窗口滑动产生的所有窗口和的最大值。
2. 输入描述
第一行输入一个正整数N,表示整数个数。(0<N<100000)
第二行输入N个整数,整数的取值范围为[-100,100]。
第三行输入一个正整数M,M代表窗口大小,M<=100000,且M<=N。
3. 输出描述
窗口滑动产生的所有窗口和的最大值。
4. Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextInt()) {
int a = sc.nextInt();
int[] array = new int[a];
for (int i = 0; i < a; i++) {
array[i] = sc.nextInt();
}
int b = sc.nextInt();
int[] arr = new int[a - b + 1];
for (int i = 0; i < a - b + 1; i++) {
arr[i] = 0;
for (int j = 0; j < b; j++) {
arr[i] += array[i + j];
}
}
// 排序,取出最后一个最大的值
Arrays.sort(arr);
System.out.println(arr[a - b]);
}
}
时间复杂度分析:
由于需要对窗口进行遍历,并计算窗口和,时间复杂度为O(NM)。
排序数组arr的时间复杂度为O((N-M+1)log(N-M+1))。
因此,整体时间复杂度为O(NM + (N-M+1)log(N-M+1))。
5. 测试
6.解题思路
题目要求在给定的整数数组中,通过滑动窗口,求得所有窗口和的最大值。窗口从数组的第一个数开始滑动,每次滑动产生一个窗口,并计算窗口内所有数的和。需要找到所有窗口和中的最大值。
算法流程:
- 读取输入的整数个数N。
- 读取输入的N个整数,将其存储在数组array中。
- 读取输入的窗口大小M。
- 创建一个大小为
N-M+1
的数组arr,用于存储窗口滑动产生的所有窗口和。 - 遍历数组array,计算每个窗口的和,并存储在arr中:
- 对于每个位置i,初始化窗口和
sum=0
。 - 遍历从i到i+M-1的范围,将array中对应位置的元素累加到sum中。
- 将sum存储在arr的第i个位置。
- 对于每个位置i,初始化窗口和
- 对数组arr进行排序。
- 输出arr的最后一个元素,即为窗口滑动产生的所有窗口和的最大值。