动态规划-最大子数组和

最大子数组和

题目描述

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

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

示例 :

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

 解题思路

这个问题是动态规划的一个经典问题,也被称作“最大子序和问题”或“最大子数组和”。解决这个问题的思路是遍历数组,在遍历的过程中,我们维护一个当前遍历到的子数组的最大和,以及全局的最大和。每当我们遍历到一个新的元素时,我们考虑两种情况:

  1. 如果将当前元素加入之前的子数组会使得子数组的和变得更大,那么我们就更新当前子数组的和。
  2. 如果当前元素自己就是一个更大的子数组(即之前的子数组和小于0,加入当前元素还不如只包含当前元素),那么我们重新开始一个新的子数组,其和就是当前元素的值。

动态规划思路

在最大子序和问题中,我们想要找到一个具有最大和的连续子数组。这个问题可以分解为多个子问题:对于数组中的每个位置,我们需要知道以该位置结尾的最大子数组和是多少。

定义状态

我们定义一个数组dp,其中dp[i]表示以nums[i]结尾的连续子数组的最大和。注意,这里的定义稍微有些不同,因为我们实际上并不需要显式地存储整个dp数组(尽管在某些情况下这样做可以方便调试和理解),而是可以通过变量来维护当前的最大和(即dp数组中的最后一个有效值)以及全局的最大和。

状态转移方程

对于每个位置i(从1开始计数,假设dp[0] = nums[0]),我们需要根据前一个状态dp[i-1]和当前元素nums[i]来更新dp[i]。这里有两种情况:

  1. 如果dp[i-1] + nums[i] > nums[i],即加上当前元素后子数组的和变得更大,那么我们就应该继续扩展这个子数组,即dp[i] = dp[i-1] + nums[i]
  2. 否则,如果dp[i-1] + nums[i] <= nums[i],即加上当前元素后子数组的和没有变得更大(甚至可能变得更小),那么我们就应该重新开始一个新的子数组,只包含当前元素,即dp[i] = nums[i]

但是,在实际编程中,我们并不需要显式地创建一个dp数组来存储每个位置的状态,因为我们可以只通过几个变量来维护当前的最大和以及全局的最大和。

初始化
  • 全局最大和初始化为数组的第一个元素(或者一个足够小的数,但在这个问题中,由于子数组至少包含一个元素,所以初始化为第一个元素是合理的)。
  • 当前最大和也初始化为数组的第一个元素。
遍历数组

从数组的第二个元素开始遍历,对于每个元素,根据状态转移方程更新当前最大和,并检查是否需要更新全局最大和。

返回结果

遍历结束后,全局最大和就是我们要找的最大子数组和。

代码示例

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

环形子数组的最大和

题目描述

给定一个长度为 n 的环形整数数组 nums ,返回 nums 的非空 子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开头相连呈环状。形式上, nums[i] 的下一个元素是 nums[(i + 1) % n] , nums[i] 的前一个元素是 nums[(i - 1 + n) % n] 。 子数组 最多只能包含固定缓冲区 nums 中的每个元素一次。形式上,对于子数组 nums[i], nums[i + 1], ..., nums[j] ,不存在 i <= k1, k2 <= j 其中 k1 % n == k2 % n 。

918. 环形子数组的最大和 - 力扣(LeetCode)

解题思路

为了解决这个问题,我们可以将问题分解为两个子问题:

  1. 非环形数组的最大子数组和:这是经典的Kadane算法问题,其中我们需要找到非环形数组中的最大子数组和。

  2. 环形数组中跨越首尾的最大子数组和:这可以通过计算原数组中去掉某个最小子数组后的最大剩余和来找到。换句话说,我们找到数组中的一个最小子数组(可能是连续的),然后从数组中去掉这个子数组,剩下的部分就是我们要找的可能跨越首尾的最大子数组。

核心思路分为两部分:

  1. 计算非环形情况下的最大子数组和
    • 使用 f 数组来记录以每个位置结尾的子数组的最大和。对于 f[i],它的值等于 max(f[i-1] + nums[i], nums[i]),即要么是当前元素自身,要么是前一个子数组的和加上当前元素(如果加上当前元素能使和更大)。
    • 遍历整个数组,同时更新 big 变量,记录到当前位置为止的最大子数组和。
  2. 计算环形情况下可能跨越首尾的最大子数组和
    • 考虑到环形特性,一个可能的最大子数组可能跨越数组的首尾。为了找到这种子数组,我们需要知道如果排除某个最小子数组后,剩余部分的和是否可能更大。
    • 使用 g 数组来记录以每个位置结尾的子数组的最小和(这里的“最小和”是为了后续计算方便,实际是为了找到可以排除的最小部分)。对于 g[i],它的值等于 min(g[i-1] + nums[i], nums[i]),即要么是当前元素自身,要么是前一个子数组的和加上当前元素(即使加上当前元素使和更小,因为我们要找的是最小和)。
    • 遍历整个数组,同时更新 sma 变量,记录到当前位置为止的最小子数组和。
    • 累加整个数组的元素到 sum 变量中,这个变量代表了整个数组的和。
    • 最后,比较两种情况:
      • 如果整个数组的和 sum 等于最小子数组和 sma,说明数组中所有元素都是负数,或者所有正数都已经被最小子数组所包含。此时,最大子数组和只能是 big(即非环形情况下的最大子数组和)。
      • 否则,可能的最大子数组和要么是 big(非环形情况),要么是 sum - sma(排除最小子数组后的剩余部分)。取两者中的较大值作为结果。

代码示例 

class Solution {
public:int maxSubarraySumCircular(vector<int>& nums) {int n = nums.size();vector<int> f(n, INT_MIN); // 最大vector<int> g(n, INT_MAX); // 最小f[0] = g[0] = nums[0];for (int i = 1; i < n; i++) {f[i] = max(f[i - 1] + nums[i], nums[i]);g[i] = min(g[i - 1] + nums[i], nums[i]);}int big = f[0];int sma = g[0];int sum = nums[0];for (int i = 1; i < n; i++) {big = max(big, f[i]);sma = min(sma, g[i]);sum += nums[i];}if (sum == sma)return big;elsereturn max(big, sum - sma);}
};

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

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

相关文章

在Nginx上部署前端Vue项目,超级简单!!

Nginx&#xff08;engine x&#xff09; 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也是一个IMAP/POP3/SMTP代理服务器。 Nginx因其高性能、可扩展性、灵活性和免费开源等优势&#xff0c;在现代Web架构中得到了广泛应用。无论是作为Web服务器直接提供服务&…

Elasticsearch 索引模板

文章目录 前言Elasticsearch 索引模板1. 作用2. 示例3. 查询索引模板4. 测试 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的…

validationtools中按键测试选项光标移除

最近处理一个问题&#xff0c;设备有方向键盘&#xff0c;做cit中的按键测试&#xff0c;发现按方向键第一次按键不能触发该键值&#xff0c;而是让屏幕第一个按钮获取焦点&#xff0c;然后再次按键&#xff0c;则其他正常。问题&#xff1a;进入界面第一次按键就要响应对应按键…

html+css+js网页设计 故宫7个页面 ui还原度100%

htmlcssjs网页设计 故宫7个页面 ui还原度100% 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1…

sqlite3的db.interrupt方法深入解析

在Node.js环境中&#xff0c;sqlite3库是一个广受欢迎的轻量级数据库库&#xff0c;它为开发者提供了一个简洁的API来与SQLite数据库进行交互。在处理长时间运行或复杂的数据库查询时&#xff0c;有时可能需要中断这些查询。sqlite3库提供了db.interrupt方法来实现这一功能。本…

Anaconda安装和环境配置教程(深度学习准备)

目录 1.下载选择 2.prompt配置 3.虚拟环境配置 4.检查是不是安装成功 5.安装jupter 6.关闭anaconda重新进入 7.总结 1.下载选择 我第一次使用的这个官网上面的邮箱的方式下载的&#xff0c;但是这个方式真的特别慢&#xff0c;于是用了这个清华的镜像网站&#xff0c;网…

K8S日志收集

本章主要讲解在 Kubernetes 集群中如何通过不同的技术栈收集容器的日志&#xff0c;包括程序直接输出到控制台日志、自定义文件日志等。 一、有哪些日志需要收集 为了更加方便的处理异常&#xff0c;日志的收集与分析极为重要&#xff0c;在学习日志收集之前&#xff0c;需要知…

GitLab 是什么?GitLab使用常见问题解答

GitLab 是什么 GitLab是由GitLab Inc.开发&#xff0c;使用MIT许可证的基于网络的Git仓库管理工具开源项目&#xff0c;且具有wiki和issue跟踪功能&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。 ​GitLab 是由 GitLab Inc.开发&#xff0c…

从0开始训练基于自己声音的AI大模型(基于开源项目so-vits-svc)

写在前面&#xff1a; 本文所使用的技术栈仅为&#xff1a;Python 其他操作基于阿里云全套的可视化平台&#xff0c;只需要熟悉常规的计算机技术即可。 目录 Step 1:注册及登录阿里云主机 Step 2:找到大模型项目 Step 3:创建大模型环境实例 Step 4:进入Ai_singer教程 Step…

代码随想录:动态规划41-44

300.最长递增子序列 题目 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7…

C语言之猜数字小游戏

哈喽&#xff0c;大家好&#xff01;我是冰淇淋加点糖。今天我们来用前面所学的知识来开发一个猜数字的小游戏&#xff0c;锻炼我们的编程能力和编程思维。 猜数字小游戏功能简介 1.随机生成一个1-100的数字。 2.玩家用户开始猜数字。 > 猜大了&#xff0c;提醒猜大了…

[米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-27浅谈XILINX BRAM的基本使用

软件版本&#xff1a;VIVADO2021.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA 实验平台&#xff1a;米联客-MLK-H3-CZ08-7100开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 http…

C#/WinForm 演示遗传算法

一、一览 二、遗传算法流程 种群初始&#xff1a;随机生成一组N个DNA&#xff0c;每个DNA上都有S个基因&#xff0c;每个DNA都有自己的r值&#xff08;适度值&#xff09;。r最大的DNA为种群最优。 选择操作&#xff1a;将每个DNA的r值占总体的比例作为新一代选取的概率&#…

2024 【Delphi 12】苹果ios开发环境配置(五星保姆级)

目录 一、创建证书 1. 创建证书签名请求&#xff1a;&#xff08;在苹果电脑上操作&#xff09;&#xff1a; .certSigningRequest 文件 2. 创建证书&#xff1a;在苹果的 开发者网站 上操作 重复以上步骤并下载对应的证书文件如下&#xff1a; 3. 创建标识符&#xff08;…

Debezium+Kafka:Oracle 11g 数据实时同步至 DolphinDB 运维手册

目前我们已经支持基于开源技术 Debezium Kafka&#xff0c;从 Mysql 和 Oracle 11g 实时同步数据到 DolphinDB 中。由于当前方案涉及到四个程序的部署&#xff0c;而且具体的 Source 同步任务和 Sink 同步任务还需要额外管理&#xff0c;在运维上具有一定难度。 本文将基于 O…

前端框架的演变与选择

目录 前端框架的演变与选择 1. 什么是前端框架&#xff1f; 2. 前端框架的演变 2.1 早期的Web开发 2.2 JavaScript库的兴起 2.3 MVC架构的引入 3. 现代前端框架概览 3.1 React 3.2 Vue.js 3.3 Angular 4. 其他值得关注的前端框架 4.1 Svelte 4.2 Ember.js 5. 如何…

【大数据】生活中三大数据的概念及其关系

数据库、数据结构和大数据之间存在密切的关联,它们共同构成了计算机科学和信息技术领域中的重要组成部分。以下是对这三者之间关系的详细阐述: 1. 数据库与数据结构的关联 数据结构是数据库的基础:数据库用于存储和管理大量数据,而这些数据的组织方式正是基于数据结构。数…

Ecology10中的CAS身份认证问题

单点登录&#xff08;SSO&#xff09;是一种身份验证解决方案&#xff0c;可让用户通过一次性用户身份验证登录多个应用程序和网站。实现SSO的方式有很多种&#xff0c;比如Kerberos、SAML、OAuth2、JWT、OpenID、CAS、LDAP等。 CAS CAS (Central Authentication Service) 最初…

西中区2024年度安全知识竞赛活动方案

为有效预防安全生产事故的发生&#xff0c;深化西中区全体员工对安全生产的认识&#xff0c;切实提升全体人员的安全意识和自我保护能力&#xff0c;夯实安全知识基础&#xff0c;丰富安全文化内涵&#xff0c;推动安全生产工作更加规范化、系统化&#xff0c;根据西中区安全生…

git 回滚的三种方式

按照从旧到新的顺序 你依次提交了 1 2 3 4 5 现在你想回到1 如何操作 第一种方法 hard reset git reset --hard 执行命令后 你会发现 效果实现了 东西都回到了那次更改 但是2345的更改都没了 并且你会发现 你有更新 这是因为这个hard reset 只会改本地的 远程的不改 一更新就…