python-剑指 Offer 42. 连续子数组的最大和【动态规划经典题解】

news2024/10/7 10:25:14

一.题目

剑指 Offer 42. 连续子数组的最大和

描述:输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为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

二.解题思路分析

1.解析

动态规划是本题的最优解法,以下按照标准流程解题。
状态定义: 设动态规划列表

2.小结:

 1.状态,即子问题。
dp[i] 代表以元素 nums[i] 为结尾的连续子数组最大和。

2.转移策略,自带剪枝。
若 dp[i−1]≤0 ,说明 dp[i−1] 对 dp[i] 产生负贡献,即 dp[i−1]+nums[i] 还不如 nums[i] 本身大。

3.状态转移方程,根据前两步抽象而来。

当 dp[i−1]>0 时:执行 dp[i] = dp[i-1] + nums[i];
当 dp[i−1]≤0 时:执行 dp[i] = nums[i] ;
4.设计dp数组,保存子问题的解,避免重复计算

5.实现代码

整个动态规划,最难的就是定义状态。一旦状态定义出来,表明你已经抽象出了子问题,可以肢解原来的大问题了。

3.附上图解:

在这里插入图片描述

三.代码

解法一:

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        for i in range(1, len(nums)):
            nums[i] += max(nums[i - 1], 0)
        return max(nums)

换一种写法:

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        res, cur = nums[0], nums[0]
        for val in nums[1:]:
            cur = max(cur+val, val) # 关键的步骤:cur 要么等于之前之和,要么从当前开始
            res = max(res, cur)
        return res

解法二:

分析:

这个题目其实可以更难一点,例如:让你打印出具有最大连续子数组的和的那个子数组,如果存在多个这样的子数组,把最左边的那个打印出来。
因为我们发现,有很多学生只会求出最大连续子数组的和,但是找不出那个子数组,这就很麻烦,只知其一,不知其二。
要想彻底理解这个题目的动态规划,就应该知道整个结果的转移过程,并且分析清楚。

实际上,就是额外加了一个idx变量,用来记录以第i个元素结尾的最大连续和的子数组的起始下标。

idx是一个动态维护的变量,当发现前一个dp值小于等于0的时候,就应该刷新这个idx,因为将第i个元素拼接上去不会使得这个子数组是最大的,因此我们也没必要再维护这个子数组的起始下标。

反之,我们维持这个idx,不会被i改变,这是因为可以拼接上去,我们要记录下这个子数组的起始。

随后,发现以i元素结尾的dp值比全局res更大,那么就更新全局的起始和终止下标。
不难发现,通过维护起始和终止下标我们就可以知道最大的,但维护res可以记录结果,避免反复计算子数组的和。

最后,就可以知道输出的子数组区间的起始和终止下标。

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        curMax = nums[0]
        res = nums[0]
        # 记录起始和结尾idx
        start = 0
        end = 0
        # 当前起始idx
        curStart = 0
        for i in range(1, len(nums)):
            if curMax > 0:
                # dp[i-1]>0时,dp[i]=dp[i-1]+nums[i],当前起始idx不变,和dp[i-1]一样
                curMax = curMax + nums[i]
            else:
                # dp[i-1]<=0时,dp[i]=nums[i],当前起始值变为i
                curStart = i
                curMax = nums[i]

            if curMax >= res:
                # 当max值改变时更新起始值和结尾值
                res = max(curMax, res)
                start = curStart
                end = i
        # 输出最大区间的idx
        print(start, end)
        return res

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

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

相关文章

html初识

HTML认知 文章目录HTML认知语法规范注释标签组成和关系标签的关系标签学习排版系列标签**标题标签****段落标签**换行标签水平线标签文本格式化标签媒体标签图片标签src 目标图片的路径alt 替换文本title 图片的标题width 宽度 / height 高度路径绝对路径相对路径&#xff08;常…

feature分支开发到一半时切换到bugfix分支,如何暂存数据

1、解决思路在工作过程中&#xff0c;当你正在当前feature分支上进行功能的开发&#xff0c;突然来了一个bug&#xff0c;要创建一个bugfix修复分支进行修复。但是当前feature分支你只开发了一半&#xff0c;显然你去提当前的半成品是不合适的&#xff0c;我们如何处理此类问题…

面试题-----JDBC单例模式(懒汉式和饿汉式)

1.单例概念 作为一种常见的设计模式&#xff0c;单例模式的设计概念是"两个私有,一个公有",即私有属性/成员变量和私有构造,以及公有方法,常用于在整个程序中仅调用一次的代码。 2.具体操作 从单例模式的描述来看,单例模式并不能用于多次频繁调用的设计中,而更适用…

【Linux】进程状态|优先级|进程切换|环境变量

文章目录1. 运行队列和运行状态2. 进程状态3. 两种特殊的进程僵尸进程孤儿进程4. 进程优先级5. 进程切换进程特性进程切换6. 环境变量的基本概念7. PATH环境变量8. 设置和获取环境变量9. 命令行参数1. 运行队列和运行状态 &#x1f495; 运行队列&#xff1a; 进程是如何在CP…

如何在Net6.0里配置多版本支持并支持注释说明的Swagger

一、前言现在已经进入了微服务的开发时代了&#xff0c;在这个时代&#xff0c;如果有人问你什么是微服务&#xff0c;你说不知道&#xff0c;就有点太丢人了&#xff0c;别人会有异样的眼光看你&#xff0c;俗话说&#xff1a;唾液淹死人。没办法&#xff0c;我们只能去学习新…

一款 Linux、数据库、Redis、MongoDB 统一管理平台,这个开源平台非常好用!

一、开源项目简介基于DDD分层实现的web版 linux(终端 文件 脚本 进程)、数据库&#xff08;mysql postgres&#xff09;、redis(单机 集群)、mongo统一管理操作平台二、开源协议使用Apache-2.0开源协议三、界面展示&#xff08;系统核心功能截图&#xff09;四、服务部署&#…

Windows 平台 oracle11g 单机 打补丁(33883353)

一、从oracle官网下载最新补丁包和打包工具 二、 对数据库及软件作全备 略 三、解压p33883353_112040_MSWIN-x86-64.zip 在33883353文件夹中打开README.html 2.1 OPatch Utility You must use the OPatch utility version 11.2.0.3.34 or later to apply this patch. 必须…

Maven 依赖-镜像仓库替换为 -- 阿里云镜像仓库(飞快实现 pom 引入)

在本地 maven 的 setting 配置文件中加上阿里云镜像地址就行了&#xff1a;新增配置内容&#xff1a;<!-- 阿里镜像仓库 --><mirrors><mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus…

高项--十大管理、47个过程、五大过程组

十大管理、47个过程、五大过程组【联想记忆】 文章目录 十大管理、47个过程、五大过程组【联想记忆】 十大管理 1.十大管理是哪几个&#xff1f; 2.十大管理记忆口诀&#xff1a; 3.各大管理记忆口诀&#xff1a; 4.十大管理、十大管理的47个过程、47个过程所属的五大过程组&a…

一篇文章搞定linux网络模型

网络协议感觉晦涩难懂&#xff1f;什么七层网络模型&#xff1f;又五层网络模型&#xff1f;又四层网络模型&#xff1f;TCP/IP协议是个啥&#xff1f;UDP是啥&#xff1f;什么是三次握手&#xff1f;什么是四次挥手&#xff1f;tcpdump听说是抓包的&#xff0c;怎么用&#xf…

期末综合考试

一、概率论1、全概率公式、贝叶斯公式应用2、期望、方差、协方差的定义以及性质证明(1) 期望(2) 方差(3) 协方差二、数理统计1、参数估计(1) 矩估计(2) 最大似然估计(3) 综合例题一、概率论 1、全概率公式、贝叶斯公式应用 记住标黄的两段&#xff0c;上考场直接套数据&#x…

相交链表【2.23】

题目&#xff1a;给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;…

SYSU程设c++(第一周) io流、命名空间、引用

理论题&#xff1a; 1.std::cout<<0a; 的输出是97 &#xff08;0转换了类型成int&#xff0c;‘a变成askll码&#xff09; 2.std::cout<<0"12.34";的输出是12.34 &#xff08;0无用&#xff0c;忽略) 3.std::cout<<1"12.34";则编译错…

批量修改word中的表格属性

背景&#xff1a;写接口文档&#xff0c;程序导出的接口文档格式不符合标书的需要&#xff0c;要批量设置word表格及文本————————————————————————————————方法&#xff1a;我们可以通过word的宏观能&#xff0c;实现批量设置。1说明&#xff…

表格内容过多时单行/多行显示

分析 单行多行显示涉及到 table-layout: fixed; 这个属性&#xff0c;默认状态下的属性值是 auto &#xff08;自动表格布局&#xff09;&#xff0c;两种不同的属性值区别如下&#xff1a; 方法 我在设置表格内容单行/多行显示时采用的方法&#xff1a; table 添加的样式&a…

JS - 原型对象、原型链是什么

一 阅读掘金 https://juejin.cn/post/7007416743215759373 https://juejin.cn/post/7007416743215759373 二 阅读掘金小册原型知识点 原型 涉及面试题&#xff1a;如何理解原型&#xff1f;如何理解原型链&#xff1f; 当我们创建一个对象时 let obj { age: 25 }&#xff0…

设备太分散?如何一站式管理边缘 OS、K8s 和应用?

作者简介 张志龙&#xff0c;SUSE 大中华区资深解决方案架构师&#xff0c;CNCF 官方认证的 CKA&CKAD 工程师&#xff0c;深耕以 Kubernetes 为代表的云原生领域&#xff0c;具备丰富的架构设计、业务容器化改造和项目落地实践经验。 据 Gartner 预测&#xff0c;到 2025 年…

【GlobalMapper精品教程】053:打开dbf文件并生成有坐标系的shp数据

本文讲解在globalmapper汇总打开dbf文件并生成有坐标系的shp数据。 文章目录一、dbf文件解读二、打开dbf文件二、另存为shp文件一、dbf文件解读 我们可以通过Excel或FME等多种软件查看dbf的结构&#xff0c;字段有&#xff1a;Name&#xff0c;kind&#xff0c;Lat&#xff0c…

事理知识图谱

事理知识图谱能够有力第建模各类事件之间的演化关联关系为事理逻辑推理提供更好的数据基础。 事理图谱定义 事理知识图谱可以将文本中对事件以及事件之间的关系抽取并抽象出来&#xff0c;构建成一个有向图形式的事理知识库。在结构上&#xff0c;事理知识图谱是一个有向有环…

SparkSQL

第1章 SparkSQL 概述1.1 SparkSQL 是什么Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。1.2 Hive and SparkSQLSparkSQL 的前身是 Shark&#xff0c;给熟悉 RDBMS 但又不理解 MapReduce 的技术人员提供快速上手的工具。Hive 是早期唯一运行在 Hadoop …