题意: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
.
难度:Medium
解法一: 最简单的办法,复杂度O(n^2),用一个变量max记录历史最大子序列和。分别以每个元素作为子序列的首元素开始往子序列里添加连续的元素,直到该子序列的和小于0为止,同时每当更新子序列的和时,要比较它与max的大小关系,如果它比max还大要更新max的值。 如果该子序列的和已经小于0了,则说明就算再往里面添数,该子序列也不可能是最大连续和的。 那么下一个子序列就要从上次子序列结束的地方开始。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.size()==0)
return 0;
int max=nums[0];
for(int i = 0;i<nums.size();i++)
{
if(nums[i]>max)
max=nums[i];
if(nums[i]<0) continue;
int sum=nums[i];
for(int j=i+1;j<nums.size();j++)
{
sum+=nums[j];
if(sum>max)
max=sum;
if(sum<0)
{
break;
}
}
if(sum>max)
max=sum;
}
return max;
}
};
这种方法虽然很容易,但是时间复杂度太高。
思路二: O(n)时间复杂度解法:
用一个max变量来记录最大值,cur变量用来标记当前连续子串的和,如果cur不为负,那么cur加上当前元素的值,如果cur的值为负,则将cur赋值为当前元素的值,注意每次循环都要比较cur与max,如果cur大于max,max要被更新。
所有元素被遍历一次后,返回max即可。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.size()==0)
return 0;
int max=nums[0];
int cur=nums[0];
for(int i = 1;i<nums.size();i++)
{
if(cur<0)
cur=nums[i];
else
cur+=nums[i];
if(cur>max)
max=cur;
}
return max;
}
};