lc.53.最大子数组和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

示例 1:

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

示例 2:

1
2
输入:nums = [1]
输出:1

示例 3:

1
2
输入:nums = [5,4,-1,7,8]
输出:23

提示:

1
2
1 <= nums.length <= 105
-104 <= nums[i] <= 104

进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。

解题算法

$dp[i] = max(dp[i-1] + a[i],a[i])$

分析:

如果 $dp[i-1]<0 $ 那么就会有 $dp[i-1]+a[i] < a[i]$ ,

因此我们知道,如果 $dp[i-1]<0$,则, $dp[i] = a[i]$, 否则 ,$dp[i] = dp[i-1]+a[i]$

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if(!nums.size()) return 0;

        int pre  = 0,res = nums[0];
        for(int cur:nums) {
            if(pre<0) pre = cur;
            else  pre = pre + cur;
            res = max(res,pre);
        }

        return res;

    }
};