版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题干:
第一行输入两个整数n,m
第二行依次输入长度为n的数组
输出一个数表示,数组中至少为m的区间的最小和
思路:
新建一个数组sum[ ]表示当前数组下标下的至少为m的和,记录最小者并返回;
其中数组sum[ ]算法:sum[m-1]等于数组中前m个元素的和,然后遍历数组,当sum[i-1] < 0时,sum[i] = sum[i-1] + nums[i],更新min(最小和);
当sum[i-1] >= 0时,比较 sum[i-1] +nums[i] 与 nums[i-m,i] 的和,sum[i] 等于两者中较小的一个,然后更新min(最小和)
public class Main {
public int minSubArray(int[] nums, int m) {
int[] sum = new int[nums.length];
int M = 0;
int sumtemp = 0;
while (M < m) {
sumtemp = sumtemp + nums[M];
sum[m - 1] = sumtemp;
M++;
}
int min = sum[m - 1];
for (int i = m; i < nums.length; i++) {
if (sum[i - 1] < 0) {
sum[i] = sum[i - 1] + nums[i];
min = Math.min(min, sum[i]);
} else {
int temp = 0;
int z = i;
for (int j = m; j > 0; j--) {
temp = temp + nums[z--];
}
sum[i] = Math.min(temp, sum[i - 1] + nums[i]);
min = Math.min(min, sum[i]);
}
}
return min;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[] num = new int[n];
for (int i = 0; i < n; i++) {
num[i] = in.nextInt();
}
in.close();
Main test = new Main();
System.out.println(test.minSubArray(num, m));
}
}