《剑指offer》面试题31:连续子数组的最大和

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

猜你喜欢

转载自blog.csdn.net/qq_25024883/article/details/80293780