剑指 Offer 42. 连续子数组的最大和 && Leetcode 53. 最大子序和 动态规划

地址   https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof/

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

要求时间复杂度为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
注意:本题与主站 53 题相同:https://leetcode-cn.com/problems/maximum-subarray/
复制代码

解答

时间复杂度为O(n)  暴力肯定TLE

(动态规划) O(n)

当前0~i的数组中 , nums[i]参与的子数组的最大和,只有两种情况,
1  与前面的子数组的最大和相加,    PreMaxSum加上nums[i],
2  不与前面的子数组相加,单独自己成为一个新的子数组。
我们求最大和,那么取两种情况中最大的和.

题目要求的是连续子数组的和,那么PreMaxSum必须也是nums[i-1]参与的数组和的最大值

那么我们定义dp[i] 是当前0~i的数组中,索引为i的数字参与的数组和的最大值

上述情况可以定义为 

dp[i] = max(dp[i-1]+nums[i],nusm[i]);

复制代码
class Solution {
public:
    int dp[100010];
    int maxSubArray(vector<int>& nums) {
        nums.insert(nums.begin(),0);
        int ans = -9999999;
        for(int i = 1;i<nums.size();i++){
            dp[i] = max(dp[i-1]+nums[i],nums[i]);
            ans = max(ans,dp[i]);
        }

        return ans;
    }
};
复制代码

 

当前0~i的数组中

posted on   itdef  阅读(158)  评论(1编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2015-02-20 监控系统 内存占用率并记录于本地文件中

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示