当前位置: 首页 > news >正文

[动规19] 最大子数组和

目录

1. 题意

2. 思路

2.1. 状态表示

2.2. 状态转移方程

2.3. 初始化

2.4. 填表顺序

2.5. 返回值

3. 编码


1. 题意

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

题目

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

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

示例 1:

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

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104

进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。

子数组:

2. 思路

2.1. 状态表示

dp[i]: 以 i 位置为结尾, 所有子数组中最大和.

2.2. 状态转移方程

要分析状态转移方程, 我们先聚焦于一个 dp[i] 位置来进行分析:

整体可以分为两类:

  • 长度 == 1
  • 长度 > 1

所以, 我们的 dp[i] = max(nums[i], nums[i] + dp[i-1]).

2.3. 初始化

因为我们的 dp[i] 依赖 dp[i-1], 因此我们需要初始化 dp[0], 下面提供两种思路:

方式 1: 初始化 dp[0] = nums[0]

方式 2: 添加虚拟节点, dp[0] = 0;// 虚拟节点 -> 不过需要注意下标的映射关系.

2.4. 填表顺序

从左到右(这是状态转移方程所决定的).

2.5. 返回值

返回以 i 位置为结尾的子数组的最大值

for(int i = 0; i < n; i++)
{
    ret = max(dp[i], ret);
}

return ret;

3. 编码

class Solution {
public:
    int maxSubArray(vector<int>& nums) 
    {
        // dp[i]表示: 以i位置为结尾, 最大的一个子数组之和
        // 1. 创建dp表
        int n = nums.size();
        vector<int> dp(n+1, 0);
        // 2. 初始化
        // 3. 赋值
        int m = INT_MIN;
        for(int i = 1; i <= n; i++)
        {
            dp[i] = max(nums[i-1], dp[i-1] + nums[i-1]);
            if(dp[i] > m) m = dp[i];
        }

        // 4. 返回
        return m;
    }
};

注意点:

  1. 略.
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/102634.html

相关文章:

  • Mentalab Explore Pro携手 Wearanize + 数据集,推动睡眠科学研究
  • 每日一题-力扣-2278. 字母在字符串中的百分比 0331
  • Java EE(19)——网络原理——应用层HTTPS协议
  • 视觉语言,轻量且开源-Gemma 3
  • nut-ui下拉选的实现方式:nut-menu
  • 快速入手-基于Django-rest-framework的第三方认证插件(SimpleJWT)权限认证扩展返回用户等其他信息(十一)
  • 闭包与作用域的理解
  • Linux操作系统下离线安装nginx
  • 嵌入式学习第三十天--队列
  • 【区块链安全 | 第二十篇】类型之运算符
  • Docker 拉取镜像部分成功部分失败?
  • TDengine 核心概念与时序数据模型深度解析(二)
  • 从TRPO到GRPO
  • scikit-surprise 智能推荐模块使用说明
  • 简单视图函数
  • (BFS)题解:P9425 [蓝桥杯 2023 国 B] AB 路线
  • 智能打印预约系统:微信小程序+SSM框架实战项目
  • 机器学习的一百个概念(6)最小最大缩放
  • Codeforces Round #1014 (Div. 2)
  • 三路排序算法
  • 本科lw指导
  • 鸿蒙NEXT开发Base64工具类(ArkTs)
  • 消息队列--RocketMQ
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例13,TableView16_13 键盘辅助拖拽示例
  • 【算法】快速幂
  • 6内存泄露问题的讨论
  • MySQL其他客户端程序
  • 边缘计算:工业自动化的智能新引擎
  • 低成本文件共享解决方案:Go File本地Docker部署与外网访问全记录
  • 小米平板 4 Plus 玩机日志