题目:
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4]
,
the contiguous subarray [4,-1,2,1]
has the largest sum = 6
.
题解:
遍历所有组合,更新最大和。
Solution 1 (TLE)
class Solution { public: int maxSubArray(vector<int>& nums) { int n = nums.size(), result = nums[0]; for(int i=0; i<n; ++i) { int tmp = nums[i]; result = max(tmp,result); for(int j=i+1; j<n; ++j) { tmp += nums[j]; result = max(tmp,result); } } return result; } };
可以看做动态规划的简略版,见Solution 5
Solution 2 ()
class Solution { public: int maxSubArray(vector<int>& nums) { int n = nums.size(), result = nums[0], tmp = 0; for(int i=0; i<n; ++i) { tmp = max(tmp + nums[i], nums[i]); result = max(result, tmp); } return result; } };
贪心算法:The idea is to find the largest difference between the sums when you summing up the array from left to right. The largest difference corresponds to the sub-array with largest sum
Solution 3 ()
class Solution { public: int maxSubArray(vector<int>& nums) { int sum = 0, minsum = 0, result = nums[0], n = nums.size(); for(int i = 0; i < n; i++) { sum += nums[i]; if(sum - minsum > res) result = sum - minsum; if(sum < minsum) minsum = sum; } return result; } };
分治法:
Solution 4 ()
DP算法:维护一个一维数组。
Solution 5 ()
class Solution { public: int maxSubArray(vector<int>& nums) { int n = nums.size(); vector<int> dp(n,0);//dp[i] means the maximum subarray ending with nums[i]; dp[0] = nums[0]; int max = dp[0]; for(int i = 1; i < n; i++){ dp[i] = nums[i] + (dp[i - 1] > 0 ? dp[i - 1] : 0); max = Math.max(max, dp[i]); } return max; } };