LeetCode 53.最大子序和

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

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
算法:动态规划。设f[i]表示以第i个元素结尾时最大子序和。

那么f[i]=max(nums[i],f[i-1]+nums[i])。即选择是否将第i个数字拼接或者以第i个数字作为开始。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n=nums.size();
        vector<int>f(n);
        f[0]=nums[0];
        int ans=f[0];
        for(int i=1;i<n;i++){
            f[i]=max(nums[i],f[i-1]+nums[i]);
            ans=max(ans,f[i]);
        }
        return ans;
        
    }
};

当然,此题还有空间复杂度为O(1)的精妙解法

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int res=INT_MIN,s=0;
        for(auto x:nums){
            if(s<0)
                s=0;
            s+=x;
            res=max(res,s);
        }
        return res;
    }
};

此解法实际上是利用状态转移的性质优化了空间

posted @ 2019-07-08 17:52  YF-1994  阅读(94)  评论(0编辑  收藏  举报