第一种:相对的复杂度为O(N^3)
//O(N^3)
public static int MaxSubsequenceSum1(int arr[]){
int sum=0;
int maxSum=Integer.MIN_VALUE;
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr.length;j++){
sum=0;
for(int k=i;k<=j;k++){
sum+=arr[k];
if(sum>maxSum){
maxSum=sum;
}
}
}
}
return maxSum;
}
第二种:相对的复杂度为O(N^2)
//O(N^2)
public static int MaxSubsequenceSum2(int arr[]){
int sum=0;
int maxSum=Integer.MIN_VALUE;
for(int i=0;i<arr.length;i++){
sum=0;
for(int j=i;j<arr.length;j++){
sum+=arr[j];
if(sum>maxSum){
maxSum=sum;
}
}
}
return maxSum;
}
第三种:相对的复杂度为O(N*LogN)----->使用递归
根据Master公式可得
public static void MaxSubsequenceSum3(int[] arr){
if(arr==null||arr.length<1){
return;
}
int right=arr.length-1;
System.out.println(maxValue(arr,0,right));
}
public static int maxValue(int[] arr,int left,int right){
if(left==right){
if(arr[left]>0){
return arr[left];
}else{
return 0;
}
}
int mid=(left+right)>>1;
int maxLeft=maxValue(arr,left,mid);
int maxRight=maxValue(arr,mid+1,right);
int maxMid=Max_Sum(arr,left,right);
return Math.max(Math.max(maxLeft, maxRight),maxMid);
}
public static int Max_Sum(int[] arr,int left,int right){
int max=0;
int thissum=arr[left]<0?(-1)*arr[left]:0;
for(int i=left;i<right;i++){
thissum+=arr[i];
if(thissum>max){
max=thissum;
}
}
return max;
}
第四种:相对的复杂度为O(N)
//O(N)
public static int MaxSubsequenceSum4(int arr[]){
int sum=arr[0]<0?arr[0]*(-1):0;
int maxSum=Integer.MIN_VALUE;
for(int i=0;i<arr.length;i++){
sum+=arr[i];
if(sum>maxSum){
maxSum=sum;
}else if(sum<0){
sum=0;
}
}
return maxSum;
}