JavaScript趣題:求解最大子陣列之和
阿新 • • 發佈:2018-12-30
這是一個整數陣列[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個元素。
第二個元素開始,需要遍歷
......
最後一個元素開始就只有它自己,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; }
-----------------------修改的分割線-----------------------
這個問題還可以使用動態規劃來求解:
DP效率很高,是O(n)的。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; }