题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为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; }