Leetcode 53-Maximum Subarray 解题报告
2017-09-24 09:20
477 查看
Leetcode 53-Maximum Subarray 解题报告
题目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.
分析
题目要找到数组的一段最大的序列和.一次遍历的方法不太好想.我们考虑使用动态规划的方法,划分子问题.
curSum[i]表示遍历到nums数组的i位时数组某个位置到i的连续和的最大值,这个和大于等于nums[i]
这里需要使用的思路是局部最大和全局最大,构造一个curSum记录直到当前遍历的数字值为止的连续序列和来表示局部最大.
同时构造一个maxSum表示全局最大.
当前的和的前一个局部和只要大于0那么就对局部和有正作用,否则我们就设置当前和从当前的点重新开始,
数学表示就是:
if curSum[i-1] <= 0 then curSum[i] = nums[i]
else if curSum[i-1] > 0 then curSum[i] = curSum[i-1]+nums[i]
同时每次变更局部和的时候和全局和比较并记录最大的哪一个.
如果考虑记录下这个序列的起止下表,需要维护3个变量,curBegin表示局部和的起点,left表示全局和的起点,right表示全局和的终点.
AC代码
class Solution { public: int maxSubArray(vector<int>& nums) { int maxSum = nums[0]; int curSum = nums[0]; int curBegin = 0, leftIndex = 0, rightIndex = 0; for (int i = 1; i < nums.size(); ++i) { curSum += nums[i]; if (curSum < nums[i]) { curSum = nums[i]; curBegin = i; } if (curSum > maxSum) { maxSum = curSum; leftIndex = curBegin; rightIndex = i; } } return maxSum; } };
相关文章推荐
- LeetCode解题-#53-Maximum subarray problem
- Leetcode 152-MaximumProductSubarray 解题报告
- LeetCode Maximum Product Subarray 解题报告
- LeetCode Maximum Product Subarray 解题报告
- [LeetCode] Maximum Subarray 解题报告
- 【LeetCode】Maximum Subarray 解题报告
- Leetcode 644. Maximum Average Subarray II 最大平均区间2 解题报告
- [LeetCode] Maximum Subarray 解题报告
- LeetCode 解题报告 Maximum Product Subarray
- LeetCode: Maximum Product Subarray 解题报告
- LeetCode: Maximum Subarray 解题报告
- [leetcode] 53. Maximum Subarray 解题报告
- LeetCode解题报告 53. Maximum Subarray [medium]
- LeetCode-53-Maximum Subarray 贪心
- [leetcode] 325. Maximum Size Subarray Sum Equals k 解题报告
- LeetCode-53:Maximum Subarray (和最大的连续子数组)
- LeetCode 53/152 Maximum Subarray/Maximum Product Subarray(动态规划)
- 【LeetCode】Binary Tree Maximum Path Sum 解题报告
- Leetcode 53:Maximum Subarray
- LeetCode(53) Maximum Subarray