输入一个整型数组,数组里面有正数也有负数,数组中连续的一个或多个整数组成子数组,每个子数组都有一个和。求所有子数组的和的最大值。
例如,输入的数字为:1,-2,3,10,-4,7,2,-5,则和最大的子数组为3,10,-4,7,2和为18。 (时间复杂度越低越好)
思路:遍历数组元素,利用两个变量去分别储存当前的最大值和遍历元素的变化。
sum代表当前位置已经遍历数组的子数组和的最大值,value则表示当前元素值的正负变化,累加过程中,若遇到value为负值的情况(连续子数组和值为负,表示该子数组不可继续累加),则直接将新的元素直接赋给value,否则继续累加。
public class solution {
public static void main(String[] args) {
int[] a = { 1, -2, 3, 10, -4, 7, 2, -5 };
System.out.println(maxSum(a, a.length));
}
public static int maxSum(int[] a, int n) {
int sum = 0;
int value = 0;
for (int i = 0; i < n; i++) {
//如果value(加和值)已经小于等于0,则更新value。
if (value <= 0)
value = a[i];
//value(加和值)大于0,继续相加。
else
value += a[i];
//判断当前的value是否已经大于sum值,则更新sum。
if (sum < value)
sum = value;
}
return sum;
}