每日一题——连续子数组的最大和

136 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

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

要求时间复杂度为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

思路

暴力破解

该题很容易想到暴力破解的思路即:枚举每一个数字,然后再循环枚举该数字之前的所有数字之和,取其最大值。但显然这样时间复杂度为O(n`2),所以我们想到可以用动态规划的思想进行优化。

动态规划

这道题很明显是一道动态规划的题目,在之前我们谈到凡是动态规划的问题我们都可以从两个角度进行思考。在状态表示上,根据经验可以很容易地确定一维数组h[i]表示前i个整数组成的子数组的和(以 nums[i] 为结尾的子数组的最大值),具有的属性就表示这些子数组的最大值;状态计算公式为:h[i] = max(sum[i],h[i - 1] + sum[i]),其代表的含义是h[i]要么是第i个数字要么是h[i - 1]加上第i个整数,也可以这样理解max(当前元素,当前元素 + 前面元素和的最大值)。

注意:此时的时间复杂度为O(n),空间复杂度为O(n)。

代码

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int length = nums.size();
        if(length == 0) return 0;
        int N = 100010;
        int h[N];
        int result = nums[0];
        h[0] = nums[0];
        
        for(int i = 1;i < length; i++)
        {
            h[i] = max(nums[i], h[i  - 1] + nums[i]);
            result = max(result, h[i]);
        }
        //cout << result << endl;
        return result;
    }
};

\