课堂小测
要求:
输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)
我采用的方法是
设输入数组为a,设置一个数组b,b的各个元素均初始化为0,b[0]取a[0]和0中最大的一个值,然后b[i]取b[i-1]+a[i],a[i],0中比较大的值,思想就是如果a[i]加上前面的数的和还小于本身的话,说明前面的数是负数,那么前面的数的和就不该加进来,但如果a[i]比0还小,前面已经小于0了,a[i]也不能加进最长子数组。
import java.util.Arrays;
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n;
n = in.nextInt();
int[] a = new int[n];
for (int i = 0; i < a.length; i++) {
a[i] = in.nextInt();
}
//数组的输入
int[] b = new int[n];
b[0] = Math.max(a[0] + b[0], b[0]);
for (int i = 1; i < n; i++) {
b[i] = Math.max(b[i - 1] + a[i], a[i]);
b[i] = Math.max(b[i], 0);
}
Arrays.sort(b);
System.out.println(b[n - 1]);
}
}
浙公网安备 33010602011771号