Leetcode--连续子数组的最大和

输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

示例1:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
 

提示:

1 <= arr.length <= 10^5
-100 <= arr[i] <= 100

思路

以上面示例为例,和最大的子数组为[4, -1, 2, 1],左右边界分别对应数组中的下标3, 6,所以最大和就为\sum_{i= 0}^6{nums[i]}- \sum_{i= 0}^3{nums[i]}= 6 ;

所以前n项累计和的最大差值便就是子数组最大的和

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        // 边界判断
        if(nums.size()== 1) return nums[0];

        int sum= 0;
        int min= 0;
        int max= 0x80000000;

        int size= nums.size();
        for(int i= 0; i< size; i++){
            sum+= nums[i];
            if(sum- min> max)
                max= sum- min;
            // 更改最小和
            if(min> sum)
                min= sum;
        }
        return max;
    }
};

参考Leetcode题解敲了个动态规划版本的,详细解释可以参考原链接

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        // 边界判断
        if(nums.size()== 1) return nums[0];

        int max= nums[0];
        int size= nums.size();
        for(int i= 1; i< size; i++){
            nums[i]+= nums[i- 1]> 0? nums[i- 1]: 0;
            max= nums[i]> max? nums[i]: max;
        }
        return max;
    }
};
发布了184 篇原创文章 · 获赞 25 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/weixin_41879093/article/details/105226100