42. 连续子数组的最大和

剑指 Offer 42. 连续子数组的最大和

思路:动态规划

  • 状态定义:dp[i]代表以元素nums[i]为结尾的连续子数组最大和。
  • 转移方程:dp[i]=max(dp[i-1]+nums[i],nums[i])
  • 初始状态:dp[0]=nums[0]
  • 返回值:返回dp列表中最大值

空间复杂度降低:

  • 由于dp[i]只于dp[i-1]和nums[i]有关,因此可以将原数组nums用作dp列表
  • 由于省去dp列表使用的额外空间,空间复杂度由O(N)降至O(1)
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if(nums.empty()) return 0;
        int res=nums[0];
        for(int i=1;i<nums.size();++i){
            nums[i]=max(nums[i-1]+nums[i],nums[i]);
            res=max(res,nums[i]);
        }
        return res;
    }
};

时间复杂度 O(n)

空间复杂度 O(1)

上一篇:42. 接雨水


下一篇:OCP 063中文考试题库(cuug内部资料)第42题