1. 程式人生 > >JavaScript趣題:求解最大子陣列之和

JavaScript趣題:求解最大子陣列之和

這是一個整數陣列[1,-1,2],它有如下的子陣列:

1.[1] sum=>1

2.[1,-1] sum=>0

3.[1,-1,2] sum=>2

4.[-1] sum=>-1

5.[-1,2] sum=>1

6.[2] sum=>2

大家可以看到,這些子陣列中,各元素之和最大是2

那麼給定任意一個整數陣列,怎樣求它的最大子陣列之和呢?

如果仔細觀察我上面列出子陣列的順序,大家可以看出這是從第一位開始窮舉。

嗯,我的方法正是窮舉,其執行的過程正是如上所示。

窮舉法在這個問題實現的效率其實並不低,可以勝任一般的需求。

我從第一個元素開始,需要遍歷N個元素。

第二個元素開始,需要遍歷

N-1個元素。

......

最後一個元素開始就只有它自己,1個元素。

也就是說,窮舉法的實際複雜度是N²/2,這樣的效率還是不錯的。

function maxContiguousSum (arr) {
    var max = 0;
    for(var i=0;i<arr.length;i++){
        var temp = 0;
        for(var j=i;j<arr.length;j++){
            temp += arr[j];
            if(temp > max){
                max = temp;
            }
        }
    }
    return max;
}

-----------------------修改的分割線-----------------------

這個問題還可以使用動態規劃來求解:

function largestSum(arr){
	//最大子陣列和
    var max = 0;
	//當前子陣列和
    var cur = 0;
    for(var i=0;i<arr.length;i++){
		//當前子陣列和為負數會影響下一項,所以重置0
        if(cur < 0){
            cur = 0;
        }
        cur += arr[i];
        if(cur > max){
            max = cur;
        }
    }
    return max;
}
DP效率很高,是O(n)的。