LeetCode解题报告 53. Maximum Subarray [medium]
2016-09-17 00:13
585 查看
题目描述
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.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.
解题思路
简而言之一句话意思就是,寻找最大序列和的子序列。最直接简单的思路肯定是不行的,时间复杂度过大。这里算法的分类是分治算法,对于分治我的思路大概是,将原数组从中点二分,那么最大子数列一定存在于左半部分数列,右半部分数列,或者横跨左右两半。需要分别计算三种分组中的最大子序列的和,并进行比较。将原序列不断一分为二,变成更小的序列,最后的子序列只剩一个元素,然后再一步步递推上去,就能找到最大的子序列。
想到分治算法的实现要用到递归,就想有没有更简单的实现方法,可以想到如果从左到右依次扫描一遍,时间复杂度只需O(n),那么实现的思路是,每扫描一个数后进行判断临时的前几个数字的数字和,如果和值是大于0的,那么说明这几个数对总的最大和是有贡献的,可以保留;如果小于0,则一定会减少最大和,也就是做出负贡献,那么就将这几个和为负数的都删去,给临时和重新赋值当前的这个数字。与此同时,记录每次的最大和,判断最大和和临时和哪个更大,因为有可能删去的那几个负数和之后,剩余的数字都是负数,并且比这个负数和更小,那么之前已经记录过的最大和仍然能显示最大和。
代码如下:
class Solution { public: int maxSubArray(vector<int>& nums) { int tempsum=nums[0]; int allmax=nums[0]; for (int i=1; i<nums.size(); i++) { if (tempsum<0) { tempsum=nums[i]; if (allmax>tempsum) { allmax=allmax; } else allmax=tempsum; //cout << tempsum << allmax << endl; } else if (tempsum>=0) { tempsum=tempsum+nums[i]; if (allmax>tempsum) { allmax=allmax; } else allmax=tempsum; //cout << tempsum << allmax << endl; } } return allmax; } };
相关文章推荐
- 【LeetCode】560.Subarray Sum Equals K(Medium)解题报告
- [leetcode] 53. Maximum Subarray 解题报告
- leetcode解题报告:53. Maximum Subarray
- [Leetcode] 53. Maximum Subarray 解题报告
- 【LeetCode】325.Maximum Size Subarray Sum Equals k(Medium)解题报告
- 【LeetCode】98. Validate Binary Search Tree(Medium)解题报告
- 【LeetCode】113.Path Sum II(Medium)解题报告
- 【LeetCode】449.Serialize and Deserialize BST(Medium)解题报告
- LeetCode解题报告 322. Coin Change [medium]
- Leetcode 53-Maximum Subarray 解题报告
- 【LeetCode】277.Find the Celebrity(Medium)解题报告(带锁题)
- [leetcode] 325. Maximum Size Subarray Sum Equals k 解题报告
- 【LeetCode】46.Permutations(Medium)解题报告
- 【LeetCode】11.Container With Most Water(Medium)解题报告
- 【LeetCode】102.Binary Tree Level Order Traversal(Medium)解题报告
- LeetCode解题报告 445. Add Two Numbers II [medium]
- 【LeetCode】156.Binary Tree Upside Down(Medium)(加锁题)解题报告
- [Leetcode] 643. Maximum Average Subarray I 解题报告
- 【LeetCode】55.Jump Game(Medium)解题报告
- [leetcode] 152. Maximum Product Subarray 解题报告