題目:從一個數組中尋找一個連續子數組,使其中元素之和最大,給出該和值。
數組
例如:數組[-2, 1, -3, 4, -1, 2, 1, -5, 4]和最大的子串是[4, -1, 2, 1],其和爲6。code
分析:遞歸
將數組從中間切分,中間元素屬於左邊,則最大子串爲下面三種狀況之一:ip
子串僅包含左邊元素;io
子串僅包含右邊元素;console
子串同時包含左邊和右邊的元素;function
代碼:class
// JavaScript solution function findMaxSubArray(a, begin, end) { if(begin >= end) return a[begin]; // 邊界判斷 var middle = Math.floor((begin + end) / 2); var leftRtn = findMaxSubArray(a, begin, middle); // 遞歸查找左邊最大值 var rightRtn = findMaxSubArray(a, middle+1, end); // 遞歸查找右邊最大值 // 查找同時包含左右元素的最大值 var leftMax = a[middle]; var rightMax = a[middle+1]; var tempSum = 0; for(var i = middle; i >= begin; --i) { tempSum += a[i]; if(tempSum > leftMax) leftMax = tempSum; } tempSum = 0; for(var i = middle + 1; i <= end; ++i) { tempSum += a[i]; if(tempSum > rightMax) rightMax = tempSum; } return Math.max(leftMax + rightMax, leftRtn, rightRtn); } // Test case var testArray = [-2, 1, -3, 4, -1, 2, 1, -5, 4]; console.log(findMaxSubArray(testArray, 0, testArray.length - 1)); // Output ==> 6