一个有N个整数元素的一维数组( A[0], A[1], ... , A[n-2], A[n-1]),子数组之和的最大值是什么?(要求子数组的元素是连续的)
给人典型的动态规划的感觉。先求到前面i个元素的最大子数组之和max,然后在此基础上考虑i+1的情况,直至n位置。
public class MaxSubArray{ public static void main(String[] args){ int[] a = new int[]{ -2, 5, 3, -6, 4, -8, 6}; System.out.println(getMax(a)); } public static int getMax(int[] a){ //max保存的是最大值 int max = a[0]; //max2保存的是遍历过程中可能的最大值 int max2 = a[0]; for(int i=1;i<a.length;i++){ //总共4种情况 //1. a[i]>0,max2>0 : 这个时候二者相加是可能的最大值 //2. a[i]>0,max2<0 :这个时候a[i]是可能的最大值 //3. a[i]<0,max2>0 : 这个时候二者相加是可能的最大值 //4. a[i]<0,max2<0 :这个时候a[i]是可能的最大值 if(a[i]>=0){ if(max2 >= 0){ max2 += a[i]; }else{ max2 = a[i]; } }else{ if(max2 >= 0){ max2 += a[i]; }else{ max2 = a[i]; } } if(max2 > max){ max = max2; } } return max; } }
代码精简后
public class MaxSubArray{ public static void main(String[] args){ int[] a = new int[]{ -2, 5, 3, -6, 4, -8, 6}; System.out.println(getMax(a)); } public static int getMax(int[] a){ //max保存的是最大值 int max = a[0]; //max2保存的是遍历过程中可能的最大值 int max2 = a[0]; for(int i=1;i<a.length;i++){ //max2大于0,则相加可能得到最大值 if(max2 >= 0){ max2 += a[i]; } //max2小于0,则相加不可能达到最大值,直接取a[i] else{ max2 = a[i]; } //更新最大值 if(max2 > max){ max = max2; } } return max; } }
评论