剑指offer-连续子数组的最大和(简单)

题目描述

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。

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

动态规划
dp[i]代表以元素nums[i]为结尾的连续子数组最大和
只关注之前的最大解dp[i-1]和当前的数字nums[i]

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        vector<int> dp(nums.size());//创建dp数组和nums数组一样大  
        dp[0] = nums[0];
        int ans = dp[0];
        for (int i = 1; i < nums.size(); i++) {
            if (dp[i - 1] < 0)//表明 dp[i - 1] 会对dp[i] 产生负贡献,dp[i - 1] + nums[i]还不如nums[i]本身大吗,重新开始
                dp[i] = nums[i];
            else//否则正贡献,继续累加
                dp[i] = dp[i - 1] + nums[i];

            if (dp[i] > ans)//打擂台找最大值
                ans = dp[i];
        }
        return ans;
    }
};

//------------------优化 省空间
不用dp,直接存到nums里

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int ans = nums[0];
        for (int i = 1; i < nums.size(); i++) {
            if (nums[i - 1] > 0)
                nums[i] = nums[i - 1] + nums[i];//之前的最大解+当前的数,更新,等号左边的nums用来保存当前最大解,起dp数组的作用
            if (nums[i] > ans)//打擂台求最大值
                ans = nums[i];
        }
        return ans;
    }
};
全部评论

相关推荐

2025-11-22 15:15
门头沟学院 Java
程序员花海:实习太简单了 学历可以的 实习描述应该是先介绍业务 再介绍技术 技术咋推动业务的 做到了啥收益 有没有做实验 实验组和对照组有什么不同 你最后学到了什么 有没有参与处理过线上问题 有没有参与过公司的code review 有没有参与过技术分享 这些都是可以在实习描述中写的 并且实习和项目不一样不会撞车 这个实习经历描述有点太偏项目了
我的简历长这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务