[Leetcode] 53. Maximum Subarray 解题报告
2017-01-12 16:27
381 查看
题目:
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array
the contiguous subarray
click to show more practice.
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.
思路:
1、动态规划法:定义dp[i]表示以位置i结尾的子数组的最大和,则递推方程为:dp[i] = max(dp[i-1] + nums[i], nums[i])。也就是说以位置i结尾的子数组的最大和有且仅有两种情况:一种是以位置i-1结尾的子数组的最大和加上元素i;一种是元素i的值(即该最大和子数组仅包含元素i),具体取决于dp[i-1]是否大于0。由于递推方程中dp[i]仅仅依赖于dp[i-1],所以可以将空间复杂度从O(n)优化到O(1),具体见下面的代码片段1。
2、分治法:虽然分治法的时间复杂度要高于动态规划法,但其思想却颇为巧妙:对于数组nums[left, ..., mid, ..., right],其子数组的最大和只有可能出现在如下三种情况下:1)出现在子数组nums[left, mid]中;2)出现在子数组nums[mid + 1, right]中;3)出现在nums[..., mid, mi
4000
d + 1, ...]中,即同时跨越nums[mid]和nums[mid+1]。那么就可以采用分治法实现,其关键在于合并部分,具体见下面的代码片段2。该方法中T(n)
= 2 * T(n/2) + O(n),所以其总体时间复杂度为O(nlogn),空间复杂度仍然为O(1)。
代码:
1、动态规划法:
2、分治法:
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.
click to show more practice.
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.
思路:
1、动态规划法:定义dp[i]表示以位置i结尾的子数组的最大和,则递推方程为:dp[i] = max(dp[i-1] + nums[i], nums[i])。也就是说以位置i结尾的子数组的最大和有且仅有两种情况:一种是以位置i-1结尾的子数组的最大和加上元素i;一种是元素i的值(即该最大和子数组仅包含元素i),具体取决于dp[i-1]是否大于0。由于递推方程中dp[i]仅仅依赖于dp[i-1],所以可以将空间复杂度从O(n)优化到O(1),具体见下面的代码片段1。
2、分治法:虽然分治法的时间复杂度要高于动态规划法,但其思想却颇为巧妙:对于数组nums[left, ..., mid, ..., right],其子数组的最大和只有可能出现在如下三种情况下:1)出现在子数组nums[left, mid]中;2)出现在子数组nums[mid + 1, right]中;3)出现在nums[..., mid, mi
4000
d + 1, ...]中,即同时跨越nums[mid]和nums[mid+1]。那么就可以采用分治法实现,其关键在于合并部分,具体见下面的代码片段2。该方法中T(n)
= 2 * T(n/2) + O(n),所以其总体时间复杂度为O(nlogn),空间复杂度仍然为O(1)。
代码:
1、动态规划法:
class Solution { public: int maxSubArray(vector<int>& nums) { if(nums.size() == 0) return std::numeric_limits<int>::min(); int max_sum = nums[0]; int sum = nums[0]; for(size_t i = 1; i < nums.size(); ++i) { sum = std::max(sum + nums[i], nums[i]); max_sum = max(max_sum, sum); } return max_sum; } };
2、分治法:
class Solution { public: int maxSubArray(vector<int>& nums) { if(nums.size() == 0) return std::numeric_limits<int>::min(); return merge(nums, 0, nums.size() - 1); } private: int merge(vector<int>& nums,int s, int t){ if(s == t) return nums[t]; int mid = (s + t) >> 1; int side_max = max(merge(nums,s,mid),merge(nums,mid + 1,t)); int left_max = nums[mid], right_max = nums[mid + 1]; int cur = left_max; for(int i = mid - 1;i >= s; i--) // the max sum that ends at nums[mid] { cur += nums[i]; left_max = max(cur,left_max); } cur = right_max; for(int i = mid + 2;i <= t;i++) // the max sum that starts at nums[mid + 1] { cur += nums[i]; right_max = max(cur,right_max); } return max(side_max,left_max + right_max); } };
相关文章推荐
- [leetcode] 53. Maximum Subarray 解题报告
- leetcode解题报告:53. Maximum Subarray
- LeetCode解题报告 53. Maximum Subarray [medium]
- LeetCode: Maximum Subarray 解题报告
- Leetcode 152-MaximumProductSubarray 解题报告
- LeetCode 152. Maximum Product Subarray 解题报告
- 【LeetCode】325.Maximum Size Subarray Sum Equals k(Medium)解题报告
- 【LeetCode】560.Subarray Sum Equals K(Medium)解题报告
- [Leetcode] 325. M 4000 aximum Size Subarray Sum Equals k 解题报告
- [Leetcode] 718. Maximum Length of Repeated Subarray 解题报告
- LeetCode 解题报告 Maximum Product Subarray
- [LeetCode] Maximum Subarray 解题报告
- [leetcode] 325. Maximum Size Subarray Sum Equals k 解题报告
- [Leetcode] 643. Maximum Average Subarray I 解题报告
- [Leetcode] 581. Shortest Unsorted Continuous Subarray 解题报告
- [Leetcode] 560. Subarray Sum Equals K 解题报告
- [leetcode] 209. Minimum Size Subarray Sum 解题报告
- LeetCode Maximum Product Subarray 解题报告
- LeetCode: Maximum Product Subarray 解题报告
- 【LeetCode】53.Maximum Subarray解题报告