题意:一串数组,正负数都有,找出和最大的子数组。
思路:三种解法。简单解法,分治解法,动规解法。
代码:
简单解法:
//简单实现方法
public class MaxSubString {
public int MaxSum(int []arr){
int besti = 0, bestj = 0;
int sum = 0;
for(int i = 0 ; i <arr.length ; i++){
int suma = 0;
for(int j = i ; j <arr.length ; j++){
suma +=arr[j];
if(suma > sum){
sum = suma;
besti = i;
bestj = j;
}
}
}
return sum;
}
分治解法:先找出center,左右找(left,center)和(center+1,right)的最大值leftSum和rightSum;再找横跨center的最大值sum,最后比较leftSum、rightSum、sum三个值的大小,返回最大值。
//分治法实现
public int MaxSum2(int []arr , int left , int right){
int sum = 0;
if(arr == null || arr.length == 0) {
return -1;
}
if(left == right){
if(arr[left] > 0) sum = arr[left];
else sum = 0;
}else{
int center = (left+right) /2;
int leftsum = MaxSum2(arr , left , center);
int rightsum = MaxSum2(arr, center+1, right);
int lefts = 0 , s1 = 0;
for(int i = center ; i >= left ; i-- ){
lefts += arr[i];
if(lefts > s1){
s1 = lefts;
}
}
int rights = 0 , s2 = 0;
for(int j = center + 1 ; j <= right ; j++){
rights +=arr[j];
if(rights > s2){
s2 = rights;
}
}
sum = s1+ s2;
if(Math.max(leftsum, rightsum) > sum) sum = Math.max(leftsum, rightsum);
}
return sum;
}
动规解法:
public int MaxSum3(int []arr){
int sum = 0 , b = 0 ;
for(int i = 1 ; i <= arr.length ; i++){
if(b > 0){
b +=arr[i-1];
}else{
b = arr[i-1];
}
if(b > sum){
sum = b;
}
}
return sum;
}