2020滴滴java开发笔试题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Miaoshuowen/article/details/101568045

题干:
第一行输入两个整数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));
	}

}

猜你喜欢

转载自blog.csdn.net/Miaoshuowen/article/details/101568045