leetcode解题报告(12):Maximum Subarray
2017-04-27 16:32
471 查看
描述
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.
分析
这道题一开始没什么思路,看了下网上的解答https://discuss.leetcode.com/topic/6413/dp-solution-some-thoughts
应该是个动态规划(DP)问题,不过说实话我对DP问题还真没什么想法。。。
但是看了下代码,秒懂(看来就算是DP问题,也是DP中的弱智)。
这道题其实很简单,就是我们每取得一个元素,就把它累加,然后和累加前的值做比较,如果比累加前的值大,就取累加后的值,否则就取累加前的值(好像叫局部最优解)。举个例子:
数组A=[1,2,3,-1,1]
当前最大值为6时(即遍历了前三个元素),下一元素为-1,累加后的值(sum)为5,小于6,则最大值(ans)还是6。再累加下一元素,发现累加后sum为6(5+1),因此不变。
但是还要考虑负数的情况:
数组B=[-2,-1,-3,3,2,1]
可以想象一下,如果是一连串的负数,那么每次累加后会变成更小的负数,那还不如不加,更一般的说:当累加后的值sum<0时,那就把sum置为0.
比如对于上面的数组B,一开始sum的值为0(初始值),累加一次后sum的值为-2,比较一次后ans更新为-2.当进入新的一轮循环时,发现sum<0,就把sum置为0,再让sum和新的元素相加,sum变为-1,比较后ans更新为-1.这样,ans就能保证保存的是更大的负数。当遍历到3时,sum经过累加后就为正数了,这时候就回到了数组A的情况。
代码如下:
class Solution { public: int maxSubArray(vector<int>& nums) { int ans = INT_MIN; int sum = 0; for(int i = 0; i != nums.size(); ++i){ if(sum < 0) sum = 0; sum += nums[i]; ans = max(sum,ans); } return ans; } };
相关文章推荐
- [leetcode] 203. Remove Linked List Elements 解题报告
- 【LeetCode】Permutations 解题报告
- leetcode解题报告(8):Remove Element
- leetcode 416 python 解题报告
- [LeetCode]Restore IP Addresses, 解题报告
- 【LeetCode】Integer to Roman 和 Roman to Integer 解题报告
- [Leetcode] 372. Super Pow 解题报告
- [leetcode] 108. Convert Sorted Array to Binary Search Tree 解题报告
- [Leetcode] 531. Lonely Pixel I 解题报告
- 【LeetCode】303. Range Sum Query - Immutable 解题报告
- LeetCode 382. Linked List Random Node 解题报告
- 【LeetCode】581. Shortest Unsorted Continuous Subarray 解题报告
- [Leetcode] 536. Construct Binary Tree from String 解题报告
- [LeetCode] Generate Parentheses 解题报告
- [LeetCode] Permutations II 解题报告
- [LeetCode] Swap Nodes in Pairs 解题报告
- [Leetcode] 379. Design Phone Directory 解题报告
- [Leetcode] 438. Find All Anagrams in a String 解题报告
- [LeetCode] Rotate Image 解题报告
- [Leetcode] 542. 01 Matrix 解题报告