题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。
思路一:对所有的数进行遍历。先判断之前的和是否为负,如果为负,置为0。加上当前值。判断是否为最大。
思路二:动态规划。以第i个数结尾的最大和 = 第i个数 + 以第i-1个数结尾的最大和。(递归用循环实现,所以思路一实现与思路一相同)
public int findGreatestSumOfArray(int[] nums) {
if (nums.length == 0)
return -1;
int max = Integer.MIN_VALUE;
int sum = 0;
// 先判断之前的和是否为负,如果为负,置为0。加上当前值。判断是否为最大。
for (int i=0; i<nums.length; i++) {
if (sum < 0) { // 前面的和为负
sum = 0;
}
sum += nums[i];
if (sum > max) { // 记录最大值
max = sum;
}
System.out.println(sum);
}
if (sum > max)
max = sum;
return max;
}