标签:
输入一个整数数组,数组里面有正数也有负数。数组中一个或连续多个整数组成的一个子数组。求所有子数组的和的最大值,要求时间复杂度O(n)
例如输入的数组为{1, -2, 3, 10, -4, 7, 2, -5},和最大的子数组为{3, 10, -4, 7, 2}。因此输出为该子数组的和 18 。
public class Test{ public static int findGreatestSum(int [] arr){ if(arr==null || arr.length <1){ throw new IllegalAccessException("Array must contains an element"); } int max=Integer.MIN_VALUE; //当前和 int curMax=0; for(int i: arr){ //curMax<=0 加上后面的数只会让和 更加小 if(curMax<=0){ curMax=i; }else{ curMax+=i; } if(max<curMax){ max=curMax; } } return max; } public static void main(String[] args){ int[] data = {1, -2, 3, 10, -4, 7, 2, -5}; int[] data2 = {-2, -8, -1, -5, -9}; int[] data3 = {2, 8, 1, 5, 9}; System.out.println(findGreatestSumOfSubArray(data)); System.out.println(findGreatestSumOfSubArray(data2)); System.out.println(findGreatestSumOfSubArray(data3)); } }
可以用动态规划的思想来分析这个问题。如果用函数 f(i)表示以第 i 个数字结尾的子数组的最大和,那么我们需要求出 max[f(i)],其中 0 <= i < n。我们可用如下边归公式求 f(i):
这个公式的意义:当以第 i-1 个数字结尾的子数组中所有数字的和小于 0 时,如果把这个负数与第 i 个数累加,得到的结果比第 i 个数字本身还要小,所以这种情况下以第 i 个数字结尾的子数组就是第 i 个数字本身。如果以第 i-1 个数字结尾的子数组中所有数字的和大于 0,与第 i 个数字累加就得到以第 i 个数字结尾的子数组中所有数字的和。
30.
标签:
原文地址:http://www.cnblogs.com/zxqstrong/p/5478568.html