一个有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;
}
}