算法日常・每日刷题--<动态规划>19

53. 最大子数组和 - 力扣(LeetCode)

题目描述

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

子数组 是数组中的一个连续部分

思路:动态规划

状态定义

dp[i]:以第 i 个元素结尾的连续子数组的最大和。

重点:dp[i] 必须包含 nums i,不能跳过。

状态转移方程

两种选择:

  1. 前面的子数组和为负数,丢弃前面的 ,从当前元素重新开始:子数组就只取 nums[i]
  2. 前面的子数组和是正数,接上前面 :dp[i-1]+nums[i]

我们在遍历过程中,用变量 ret 持续记录全局最大值,最后返回。

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n=nums.size();
        vector<int> dp(n,0);
        dp[0]=nums[0];
        int ret=nums[0];
        for(int i=1;i<n;i++)
        {
            dp[i]=max(nums[i],dp[i-1]+nums[i]);
            ret=ret>dp[i]?ret:dp[i];
        }
        return ret;
    }
};
相关推荐
考研保研资料分享3 小时前
新闻传播保研经验:中传预推免面试、广告学代表作与实习准备(2025)
面试·职场和发展
没有钱的钱仔4 小时前
协方差矩阵含义
算法·机器学习·矩阵
垆边人似月.4 小时前
华为机试题 :和为 K 的子数组个数
算法·leetcode·华为
三*一4 小时前
优化修整算法
前端·javascript·算法
达子6665 小时前
RUST 图解 第 3 章:通用编程概念(Common Programming Concepts)
开发语言·算法·rust
夏幻灵5 小时前
每日一题:LeetCode 165:比较版本号
算法·leetcode·职场和发展
道尔柯南5 小时前
C++ 面向对象编程入门:类和对象(上)
开发语言·c++·算法
Navigator_Z5 小时前
LeetCode //C - 1288. Remove Covered Intervals
c语言·算法·leetcode