您的位置:首页 > 其它

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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: