連續子序列最大和的各種算法

  • 問題描述:給定(可能是負整數)整數序列A1,A2,...,An,尋找(並標識)使的值最大的序列。如果所有的整數都是負的,那麼連續子序列的最大和是零。

  • 簡單的O(N^3)算法
public static int maxSubsequenceSum(int[] a){  
    int maxSum=0;  
    for(int i=0;i<a.length;i++)  
        for(int j=0;j<a.length;j++){  
            int thisSum=0;         //當輸入全是負整數時,可以保證連續子序列之和等於0
            for(k=i;k<=j;k++){  
                thisSum+=a[j];     //每次j加1後,都要進行一次a[i]+a[i+1]+...+a[j]的計算,是不是可以考慮改進該計算,第二種算法就是基於此
                if(thisSum>maxSum){  
                    maxSum=thisSum;  
                    seqStart=i;  //記錄連續子序列的起始位置
                    seqEnd=j;    //記錄連續子序列的結束位置
                }  
            }  
        } 
 return maxSum; 
}


  • 改進的O(N^2)算法
public static int maxSubsequenceSum(int[] a){
		int maxSum=0;
		for(int i=0;i<a.length;i++){
			int thisSum=0;
			for(j=i;j<a.length;j++{
                                thisSum+=a[j]; //基於第一種算法,先計算出a[i]+a[i+1]+...a[j-1]的和,那麼a[i]+...+a[j]只需要再做一次加法就可以了
				if(thisSum>maxSum){
					maxSum=thisSum;
					seqStart=i;
					seqEnd=j; 
				}
			} 
		} 
		return maxSum;
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章