给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
在本题中,我想到的两种方法,一种是普通的枚举法,时间复杂度为o(n^2),还有一种是动态规划,时间复杂度为o(n);具体的过程如下:
(1)枚举法:将数组的每一个数依次作为sum求和的第一个数,依次往后求和,同时存储最大的数值,用了两个for循环,但是在允许时间范围之内,直接AC;代码如下:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int count=nums.size();
if(count<1) return NULL;
int max=nums[0];int st=0;int sum=0;
for(int i=0;i<count;i++)
{
st=nums[i];
sum=0;
for(int j=i;j<count;j++)
{
sum+=nums[j];
if(sum>max)
{
max=sum;
}
}
}
return max;
}
};
(2)第二种是动态规划法:设sum[i]为以第i个元素结尾且和最大的连续子数组。即sum[i] = max(sum[i-1] + a[i], a[i])。可以通过判断sum[i-1] + a[i]是否大于a[i]来做选择,而这实际上等价于判断sum[i-1]是否大于0。代码如下:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n=nums.size();
if(n<1) return NULL;
int sum=0;int max=nums[0];
for(int i=0;i<n;i++)
{
//sum=sum+nums[i];
if(sum>=0)
{
sum+=nums[i];
}
else{
sum=nums[i];
}
if(sum>max)
max=sum;
}
return max;
}
};