Java計算連續子向量的最大和

題目描述

HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全爲正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:{6,-3,-2,7,-15,1,2,2},連續子向量的最大和爲8(從第0個開始,到第3個爲止)。你會不會被他忽悠住?(子向量的長度至少是1)



我的一版的想法是,用一個sum和一個temp來比較,sum記錄當前的最大和,temp記錄每次相加和。

如果temp>sum,那麼就改變sum的值,這樣sum的值就是連續子向量的最大值。

但是第一版代碼並沒有完全通過。通過了示範用例,但是有一些用例還是沒有通過:

public class Solution {
    public int FindGreatestSumOfSubArray(int[] array) {
       
         int sum=array[0],temp=0;   
	        
	        
	        for(int j=0;j<array.length;j++){
	            temp+=array[j];
	            if(temp>sum){
	                sum=temp;
	             
	            }
	        }
	        
	        return sum;
	    }
}


分析沒有通過的用例:

測試用例:
[1,-2,3,10,-4,7,2,-5]

對應輸出應該爲:

18

你的輸出爲:

17


爲什麼會出現這個情況呢?

1,-2,3,……

其實前面這個1是應該不要的。這個1和-2的和 -1 就是造成我的結果爲17的原因。


因此我覺得要多加一個判斷: arr[i]>0;arr[i+1]<0,需要判斷這個負數對arr[i]造成的影響到底有沒有抵消arr[i]的正值。如果是負值那麼說明這個正數和負數統統都不能要了。把temp置0,重新開始找。

最後AC的代碼爲

public class Solution {
    public int FindGreatestSumOfSubArray(int[] array) {
       int sum=array[0],temp=array[0];   
	        
	        
	        for(int j=1;j<array.length;j++){
	            temp+=array[j];
	            if(temp>=sum){
	                sum=temp;	             
	            }else if(temp<0){
	            	
	            	temp=0;
	            }
	        }
	        
	        return sum;
		 
		 
	    }
}



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