LeetCode刷题复盘笔记—一文搞懂动态规划之53. 最大子数组和问题(动态规划系列第三十五篇)

news2024/11/20 9:24:57

今日主要总结一下动态规划的一道题目,53. 最大子数组和

题目: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

方法一、动态规划解法

动规五部曲如下:

  1. 确定dp数组(dp table)以及下标的含义
    dp[i]:包括下标i之前的最大连续子序列和为dp[i]。

  2. 确定递推公式
    dp[i]只有两个方向可以推出来:
    dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和
    nums[i],即:从头开始计算当前连续子序列和
    一定是取最大的,所以dp[i] = max(dp[i - 1] + nums[i], nums[i]);

  3. dp数组如何初始化
    从递推公式可以看出来dp[i]是依赖于dp[i - 1]的状态,dp[0]就是递推公式的基础。
    dp[0]应该是多少呢?
    根据dp[i]的定义,很明显dp[0]应为nums[0]即dp[0] = nums[0]。

  4. 确定遍历顺序
    递推公式中dp[i]依赖于dp[i - 1]的状态,需要从前向后遍历。

  5. 举例推导dp数组

以示例一为例,输入:nums = [-2,1,-3,4,-1,2,1,-5,4],对应的dp状态如下:
在这里插入图片描述
注意最后的结果可不是dp[nums.size() - 1]! ,而是dp[6]。

在回顾一下dp[i]的定义:包括下标i之前的最大连续子序列和为dp[i]。

那么我们要找最大的连续子序列,就应该找每一个i为终点的连续最大子序列。

所以在递推公式的时候,可以直接选出最大的dp[i]。

C++代码

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

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

方法二、 贪心解法

贪心贪的是哪里呢?

如果 -2 1 在一起,计算起点的时候,一定是从1开始计算,因为负数只会拉低总和,这就是贪心贪的地方!

局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。

全局最优:选取最大“连续和”

局部最优的情况下,并记录最大的“连续和”,可以推出全局最优。

从代码角度上来讲:遍历nums,从头开始用count累积,如果count一旦加上nums[i]变为负数,那么就应该从nums[i+1]开始从0累积count了,因为已经变为负数的count,只会拖累总和。

这相当于是暴力解法中的不断调整最大子序和区间的起始位置。

那有同学问了,区间终止位置不用调整么? 如何才能得到最大“连续和”呢?

区间的终止位置,其实就是如果count取到最大值了,及时记录下来了。例如如下代码:

if (count > result) result = count;

这样相当于是用result记录最大子序和区间和(变相的算是调整了终止位置)。

如动画所示:
在这里插入图片描述
红色的起始位置就是贪心每次取count为正数的时候,开始一个区间的统计。

C++代码

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        // int res = nums[0]; 初始化方法一
        int res = INT_MIN; //初始化方法二
        int count = 0;
        for(int i = 0; i < nums.size(); i++){
            count += nums[i];
            if(count > res){
                res = count;
            }
            if(count <= 0) count = 0;
        }
        return res;
    }
};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)


总结

动态规划
英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。
动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的

对于动态规划问题,可以拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了!

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

这篇文章主要总结了分别使用动态规划和贪心算法两种方法解决了53. 最大子数组和问题,动态规划中依然是使用动规五部曲,做每道动态规划题目这五步都要弄清楚才能更清楚的理解题目!
欢迎大家关注本人公众号:编程复盘与思考随笔
(关注后可以免费获得本人在csdn发布的资源源码)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

成年人的崩溃一触即发,掌握学习能力才能突破认知结界,干货满满!

成年人的崩溃一触即发&#xff0c;掌握学习能力才能突破认知结界&#xff01; 今年2月份&#xff08;2022-02&#xff09;&#xff0c;从小红书上购买了知识博主【老明读书】&#xff0c;针对学习能力的讲解分析&#xff0c;真是干货满满&#xff01;非常感谢老明&#xff0c;…

FPGA项目案例展示

MIPI视频拼接&#xff1a; 在无人机、智能驾驶中&#xff0c;摄像头多达十几路 为解决图像处理芯片&#xff08;如海思、高通平台&#xff09;的接口瓶颈 需要将多个摄像头合成一路处理。 SLVS-EC转MIPI SLVS-EC采集&#xff0c;LANE速率可达4.6G MIPI输出&#xff0c;速率2.…

基于ASP.net Mvc的超市管理系统

摘 要 网络的广泛应用给生活带来了十分的便利。所以把天美意超市管理与现在网络相结合&#xff0c;利用net语言建设天美意超市管理系统&#xff0c;实现天美意超市管理的信息化。则对于进一步提高天美意超市发展&#xff0c;丰富天美意超市管理系统能起到不少的促进作用。 天美…

SHELL 脚本练习 一

习题一 &#xff1a;在当前主机编写脚本文件history_max.sh显示主机中执行频率最高的前5个命令 习题二 &#xff1a; 判断主机是否存在rhel用户&#xff0c;如果存在则设置密码为redhat,如果不存在则创建用户 并设置密码 习题三 &#xff1a;通过设置变量HISTTIMEFORMAT&#x…

【小白课程】openKylin系统音频大体框架介绍

在桌面操作系统中&#xff0c;音频是至关重要的一环&#xff0c;音频的稳定支持直接决定了用户的听感以及使用体验&#xff0c;今天我们就给大家介绍openKylin桌面操作系统背后关于音频的那些故事。 先看一张框架图&#xff0c;这张图大致介绍了openKylin操作系统音频的框架组…

动态配置开发模式在转转的落地实践

文章目录一、问题背景1.1 场景概述1.2 风险问题1.3 效率问题二、问题剖析2.1 以往的应对方式2.2 主要矛盾点与问题本质的探索2.2.1 主要矛盾点2.2.2 问题本质的探索三、方案设计3.1 视图展示的标准化3.2 视图构建的自动化3.3 开发体验的沉浸化3.4 整体架构设计四、落地现状五、…

谷粒商城之高级篇

谷粒商城之高级篇 目录谷粒商城之高级篇前言2 商城业务2.1 商品上架2.1.1 商品Mapping2.1.2 上架细节2.1.3 数据一致性2.1.4 代码实现2.2 商城系统首页2.2.1 渲染首页2.2.2 渲染一级分类数据2.2.3 渲染二级三级分类数据2.2.4 nginx 搭建域名访问环境2.3 检索业务2.3.1 页面环境…

Vue3富文本编辑器wangEditor 5使用总结

wangEditor 是一个开源 Web 富文本编辑器&#xff0c;开箱即用&#xff0c;配置简单 官网链接&#xff1a;https://www.wangeditor.com 使用流程&#xff1a; 1.在项目中安装wangEditor 输入以下命令安装 npm install wangeditor/editor --save npm install wangeditor/edi…

React通用后台管理系统-笔记1

环境 node: 16.17.1 npm: 8.15.0 Ant Design of React官网&#xff1a;https://ant.design/docs/react/introduce-cn 一、创建项目 npm init vite Project name: lege-management Select a framework: react Select a variant: react-ts 打开package.json&#xff0c;参考以下…

三、串(字符串)

一、定义及常见术语 串相等&#xff1a;当两个串的长度相等且对应位置上的字符都相同时&#xff0c;这两个串才是相等的 所有的空串都是相等的 二、两种存储结构 2.1顺序存储结构&#xff08;更常用&#xff09; #define MAXLEN 255 typedef struct {char ch[MAXLEN1];//存…

Flink Shuffle 3.0: Vision, Roadmap and Progress

摘要&#xff1a;摘要&#xff1a;本文整理自阿里云高级技术专家宋辛童 (五藏)&#xff0c;在 FFA 2022 核心技术专场的分享。本篇内容主要分为五个部分&#xff1a;Flink Shuffle 的演进流批融合云原生自适应Shuffle 3.0Tips&#xff1a;点击「阅读原文」查看原文视频&演讲…

Node.js--》模块化、npm与包的讲解与使用

目录 模块化 Node.js中模块的分类 模块作用域 模块的加载机制 npm与包 npm包管理工具的安装与使用 包管理配置文件 包下载速度 包的分类 发布包 模块化 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对整个系统来说&#xff0…

数据湖---hudi简介

文章目录hudi是什么核心概念TilelineTable TypesQuery Types特性官网 hudi是什么 apache hudi是下一代流式数据湖平台。hudi将数仓和数据库的核心功能带到了数据湖。提供表、事务、高效的upsert、delete&#xff0c;高级索引&#xff0c;流式注入服务&#xff0c;数据集群、压…

圣诞特辑 · Three.js加载圣诞树模型

&#x1f384;2022年圣诞节到来啦&#xff0c;很高兴这次我们能一起度过~&#x1f384; 文章目录&#x1f389;前言&#x1f50e;预览&#x1f381;项目&资源项目源码地址打包运行✒️编码实现&#x1f389;前言 2022圣诞节来了&#xff0c;让我们一起使用Three.js实现导入…

渗透测试-ctfshow 爆破(web入门)

大家可以关注一下我的公众号-小白渗透测试&#xff0c;互相学习。 web1 打开环境 先随便输入一个账号密码&#xff0c;使用bp进行抓包分析。 可以看到&#xff0c;账号密码进行了base64加密&#xff0c;使用工具进行解密&#xff0c;可以看到是账号:密码这样一个格式。 然后我…

JavaSE笔记——函数式编程(Lambda表达式)

文章目录前言一、第一个Lambda表达式二、如何辨别Lambda表达式三、引用值&#xff0c;而不是变量四、函数接口五、类型推断总结前言 Java 8 的最大变化是引入了 Lambda 表达式——一种紧凑的、传递行为的方式。 一、第一个Lambda表达式 Swing 是一个与平台无关的 Java 类库&a…

数组与集合有什么不同之处

这个问题其实就是一个非常基础的面试题&#xff0c;一般面试官想了解你基础知识方面的掌握时&#xff0c;基本都会问这个问题&#xff0c;尤其是一些&#xff0c;计算机学子毕业之后&#xff0c;如果还是想要从事计算机技术相关的行业时&#xff0c;那么在面试的时候就需要做好…

Faster RCNN网络源码解读(Ⅰ) --- Fast RCNN、Faster RCNN论文解读

目录 一、Fast R-CNN论文解读 二、Faster R-CNN论文解读 一、Fast R-CNN论文解读 Fast R-CNN是作者Ross Girshick继R-CNN后的又一力作。同样使用VGG16作为网络的backbone&#xff0c;与R-CNN相比训练时间快9倍&#xff0c;测试推理时间快213倍&#xff0c;准确率从62%提升至66…

Win10家庭版安装Docker桌面版

文章目录1.主板BIOS中开启虚拟化2.开启Hyper-V&#xff08;1&#xff09;使用下列代码生成一个.cmd文件&#xff0c;并以管理员身份运行该文件。&#xff08;2&#xff09;看到运行成功即可关闭该文件。&#xff08;3&#xff09;勾选Hyper-V设置里的所有选项&#xff08;4&…

2-2-3-10、并发设计模式

目录终止线程的设计模式Two-phase Termination&#xff08;两阶段终止&#xff09;模式——优雅的终止线程使用场景避免共享的设计模式Immutability模式——想破坏也破坏不了如何实现使用 Immutability 模式的注意事项Copy-on-Write模式应用场景Thread-Specific Storage 模式—…