最大子串行求和的問題就是對於給定的整數數列(裡面可能有負數)a1,a2,…an,求ai到ak的和的最大值。
例如 -2,11,-4,13,-5,-2 這個數列的最大子串行和就是11-4+13=20。下面用四種方法實現這個功能。時間複雜度依次減小。
用三個for迴圈
public class maxsubsum ;
int maxsum=0,i,j,k;
for(i=0;imaxsum)}}
}system.out.println(maxsum);
}}
很顯然這個的時間複雜度是o(n3)
用兩個for迴圈,上面的第三個for是可以不用的
public class maxsubsum2 ;
int maxsum=0,i,j;
for(i=0;imaxsum)}}
system.out.println(maxsum);
}}
少了乙個for,時間複雜度為o(n2)
用遞迴,程式較多一點
public class maxsubsum3
else
}int center=(left+right)/2;
int maxleftsum=maxsum(a,left,center); //左邊遞迴
int maxrightsum=maxsum(a,center+1,right); //右邊遞迴
int maxleftbodersum=0,leftbodersum=0;
for(int i=center;i>=left;i--)
}int maxrightbodersum=0,rightbodersum=0;
for(int i=center+1;i<=right;i++)
}return max(maxleftsum,maxrightsum,maxleftbodersum+maxrightbodersum);
}private int max(int x, int y, int z)
else
if(temp>z)
else
return result;
}/**
* @param args
*/public static void main(string args) ;
maxsubsum3 max=new maxsubsum3();
max.maxsum(a, 0, a.length-1);
system.out.println(max.maxsum(a, 0, a.length-1));
}}
這兩個for是找出含有中間項的和的最大值。這個演算法遞迴的是每次變成n/2,然後for迴圈的時間複雜度為o(n),整個演算法的時間複雜度是o(nlogn)。
最後乙個也是最優的演算法了吧 ,因為不需要知道這個子串行在**,只需要知道最後的值,子串行中第一項如果是負數那麼肯定不能是最大的了。
public class maxsubsum4
; int maxsum=0,thissum=0;
for(int i=0;imaxsum)
else if(thissum<0)
}system.out.println(maxsum);
}}
這個只有乙個for迴圈,所以時間複雜度為o(n)。 最大子串行和的四種求解方法
最大子串行和問題 include includeusing namespace std const int maxn 100 5 分治 int maxz int a,int x,int y 返回陣列左閉右開區間的最大和 v 0 r a m for int i m i y i return max m...
最大子串行和的四種演算法
1.窮舉法 演算法思想 算出每個子串行的和,即算出序列中第i個到第j個數的和 j i 並進行比較 演算法 public static int maxsubsum1 int a if sum maxsum return maxsum 執行時間為o n 3 2.對上述第乙個演算法的改進 演算法思想 第乙...
最大子串行和的四種演算法
算出每個子串行的和,即算出序列中第i個到第j個數的和 j i 並進行比較。執行時間為o n 3 maxsum 0 nums d n int input 輸入陣列長度 for i in range 0 n k int input 輸入資料 for i in range 0 len nums for j...