leetcode-每日一题53.最大子序和

121 阅读1分钟

题目描述

给定一个整数数组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)。