题目描述:
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。(源自leetcode 53.)
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1] 输出:1
示例 3:
输入:nums = [5,4,-1,7,8] 输出:23
算法分析:
假设我们已经知道了以j结尾的最大子段和为k,并且由前j项所得的最大和为sum。
那么以下有这么几种情况:
1.
假设k+nums[j+1]<0,那么我们可以得知以j+1结尾的最大子段和是个负数(这里要特别说明一下,当数据特殊的情况下,k可能是不存在的,我们这种时候需要把k当作0处理,可以理解为从j+1重新开始计数)
我们下一步去看看这个k+nums[j+1]是不是>sum,如果是,那么sum=k+nums[j+1],记录下新的最大值。
因为以j+1结尾的最大和是个负数,它会妨碍下一个数的最大和,所以必须从下一个重新记数,k=0
2.
假设k+num[j+1]>=0,同1的情况,我们先看看和sum的大小,观察是否是我们要找的那个sum。但是因为以j+1结尾的子段和是非负数,我们把它保留到j+2中
一些特别说明:
如果用temp来存贮k的值的话,temp初始值=0,sum=num[0],不然的话sum计算可能出问题
判断要在更改temp之前,不然置零的temp会对sum(尤其是负数多的用例)产生干扰
代码实现(c++):
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int length=nums.size();
int temp=nums[0];int sum=nums[0];
for(int i=0;i<length;i++)
{
if(i!=0)
temp=temp+nums[i];
if(temp>sum)
sum=temp;
if(temp<0&&length!=1)
temp=0;
}
return sum;
}
};