编程之美--2.14求数组的子数组之和的最大值
问题:一个有N个整数元素的一维数组( A[0], A[1], ... , A[n-2], A[n-1]),这个数组的子数组之和的最大值是什么?(注意:要求子数组的元素是连续的)
main函数
public static void main(String args[]){ int[] arr0 = {1,-2,3,5,-3,2}; int[] arr1 = {0,-2,3,5,-1,2}; int[] arr2 = {-9,-2,-3,-5,-3}; System.out.println("解法1:"); MaxSum(arr0); MaxSum(arr1); MaxSum(arr2); System.out.println("\n解法2:"); MaxSum2(arr0); MaxSum2(arr1); MaxSum2(arr2); }
解法1:
public static int MaxSum(int[] arr){ int sum = arr[0]; int max_sum = arr[0]; int index_start = 0; int index_start_max = 0; int index_end = 0; int index_end_max = 0; int len = arr.length; for(int i =1 ; i<len ;i++){ if(sum<0){ //实际上是if(sum+arr<arr) sum = arr[i]; index_start = i; index_end = i; }else{ sum +=arr[i]; index_end = i; } if(sum>max_sum){ max_sum = sum; index_start_max = index_start; index_end_max = index_end; } } System.out.println("连续子数组最大的和sum="+max_sum); System.out.println("下标开始位置:"+index_start_max + ", 下标结束位置:"+index_end_max); return max_sum; }
结果:
解法1:
连续子数组最大的和sum=8
下标开始位置:2, 下标结束位置:3
连续子数组最大的和sum=9
下标开始位置:2, 下标结束位置:5
连续子数组最大的和sum=-2
下标开始位置:1, 下标结束位置:1
-----------------------------------------
解法2:实际上和解法1相同,解法二从后向前进行,且解法1多了指示起止位置的功能,解法二不行
//解法2 实际上和解法1相同,解法1多了指示起始位置的功能 public static int MaxSum2(int[] arr){ int len = arr.length; int start = arr[len-1]; int all = arr[len-1]; for(int i = len-2 ; i>=0 ;i --){ start = Math.max(arr[i], arr[i]+start); all = Math.max(start, all); } System.out.println("MaxSum="+all); return all; }
结果:
解法2: MaxSum=8 MaxSum=9 MaxSum=-2

浙公网安备 33010602011771号