题目描述
给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
思路
该题使用贪心算法。从左到右遍历数组,记录三个变量:当前和、最大和、之前和等,如果之前和小于0,则丢弃,因为之前和加上当前值只会使当前值变小,所以重新设置之前和和当前和,并判断最大和。
C++代码
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if (nums.size() == 0)
{
return -1;
}
int maxSum = nums[0];
int preSum = nums[0];
int curSum;
for (int i = 1; i < nums.size(); i++)
{
if (preSum < 0)
{
curSum = nums[i];
preSum = curSum;
}
else
{
curSum = preSum + nums[i];
preSum = curSum;
}
if (curSum > maxSum)
{
maxSum = curSum;
}
}
return maxSum;
}
};
时间复杂度:O(N),N为数组长度。
空间复杂度:O(1)。