LeetCode - 53. Maximum Subarray
Description
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.
More practice:
If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.
Solution
解题思路参考了
-
@LiamHuang said in DP solution & some thoughts:
When we are talking about DP, the first problem comes out to our mind should be: what's the statement of the sub-problem, whose format should satisfy that if we've solved a sub-problem, it would be helpful for solving the next-step sub-problem, and, thus, eventually helpful for solving the original problem.
Here is the sub-problem we state: denote
int_local_max[i]
as the max-sub-array-sum that ends withnums[i]
. The relationship between the two steps is simple:int_local_max[i + 1] = max (int_local_max[i] + nums[i + 1], nums[i + 1])
orint_local_max[i + 1] = (int_local_max[i] > 0) ? int_local_max[i] + nums[i + 1] : nums[i + 1]
.Now, all we have to do is to scan through the array, and find which
int_local_max[i]
is the maximum of all theint_local_max
s.
python
1 class Solution(object): 2 def maxSubArray(self, nums): 3 """ 4 :type nums: List[int] 5 :rtype: int 6 """ 7 # [-2,1,-3,4,-1,2,1,-5,4] 8 max_num = max(nums) 9 if max_num < 0: 10 return max_num 11 12 max_sum = 0 13 cur_sum = 0 14 nums_len = len(nums) 15 for i in range(nums_len): 16 cur_sum = cur_sum + nums[i] 17 if cur_sum < 0: 18 cur_sum = 0 19 continue 20 21 if cur_sum > max_sum: 22 max_sum = cur_sum 23 24 return max_sum
cpp
1 class Solution { 2 public: 3 int maxSubArray(vector<int>& nums) { 4 if (nums.size() == 0) 5 return 0; 6 7 if (nums.size() == 1) 8 return nums.at(0); 9 10 int max_sum = nums.at(0); 11 int cur_sum = nums.at(0); 12 size_t length = nums.size(); 13 for (size_t i=1; i<length; ++i) 14 { 15 cur_sum = max(cur_sum + nums.at(i), nums.at(i)); 16 max_sum = max(cur_sum, max_sum); 17 } 18 19 return max_sum; 20 } 21 };