LeetCode刷题--- 环形子数组的最大和

个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客

个人专栏

力扣递归算法题

 http://t.csdnimg.cn/yUl2I

【C++】    

​​​​​​http://t.csdnimg.cn/6AbpV

数据结构与算法

 ​​​http://t.csdnimg.cn/hKh2l


前言:这个专栏主要讲述动态规划算法,所以下面题目主要也是这些算法做的  

我讲述题目会把讲解部分分为3个部分:
1、题目解析

2、算法原理思路讲解

3、代码实现


环形子数组的最大和

题目链接:环形子数组的最大和

题目

给定一个长度为 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 。

示例 1:

输入:nums = [1,-2,3,-2]
输出:3
解释:从子数组 [3] 得到最大和 3

示例 2:

输入:nums = [5,-3,5]
输出:10
解释:从子数组 [5,5] 得到最大和 5 + 5 = 10

示例 3:

输入:nums = [3,-2,2,-3]
输出:3
解释:从子数组 [3] 和 [3,-2,2] 都可以得到最大和 3

提示:

  • n == nums.length
  • 1 <= n <= 3 * 104
  • -3 * 104 <= nums[i] <= 3 * 104

解法

算法原理讲解

本题与「最大子数组和」的区别在于,考虑问题的时候不仅要分析「数组内的连续区域」,还要考 虑「数组首尾相连」的⼀部分。结果的可能情况分为以下两种:
  1. 结果在数组的内部,包括整个数组。
  2. 结果在数组首尾相连的⼀部分上。

对于第⼀种情况,我们仅需按照「最大子数组和」的求法就可以得到结果,记为 fmax 。 对于第二种情况,我们可以分析⼀下:
  1. 如果首尾相连的位置是最大的子数组和,那么中间会空出一部分来。
  2. 因为数组的总和 sum 是不变的,所以中间空出来的一部分必定是最小的子数组和。

 对于第⼆种情况的最大和,应该等于 sum - gmin ,其中 gmin 表示数组内的「最小子数组和」。

两种情况的最大值就是我们最后要的结果。


我们这题使用动态规划,我们做这类题目可以分为以下五个步骤

  1. 状态显示
  2. 状态转移方程
  3. 初始化(防止填表时不越界)
  4. 填表顺序
  5. 返回值
  • 状态显示

f[i] 表示: 以 i  位置元素为结尾的「所有子数组」中和的最大和。

g[i] 表示: 以 i  位置元素为结尾的「所有子数组」中和的最小和。

  • 状态转移方程

f[i] 的所有可能可以分为以下两种:

  1. 子数组的长度为 1 :此时 f[i] = nums[i] ;
  2. 子数组的长度大于 1 :此时 f[i] 应该等于 以 i - 1 做结尾的「所有⼦数组」中和的最大值再加上 nums[i] ,也就是 f[i - 1] + nums[i] 。

由于我们要的是「最大值」,因此应该是两种情况下的最大值,因此可得转移方程: f[i] = max(nums[i], f[i - 1] + nums[i]) 。

同理可得,我们可以得出 f[i] 和 g[i] 的状态转移方程

  1. f[i] = max(nums[i], f[i - 1] + nums[i]) 。
  2. g[i] = min(nums[i], g[i - 1] + nums[i]) 。

  • 初始化(防止填表时不越界)

最前面加上⼀个格子,并且让 f[0] = 0 和 g[0] = 0 即可。

  • 填表顺序

根据「状态转移方程」易得,填表顺序为「从左往右」。

  • 返回值
  1. 先找到 f 表里面的最大值 -> fmax
  2. 找到 g 表里面的最小值 -> gmin
  3. 统计所有元素的和 -> sum
直接返回 两种情况下的最大值,就是我们要的结果吗?
错错错!!!
由于数组内有可能全部都是负数(例如[-1,-2,-3],正确结果应该是-1,但是这样求出的结果是0),第⼀种情况下的结果是数组内的最大值(是个负数),第 ⼆种情况下的 gmin == sum ,求的得结果就会是 0 。若直接求两者的最⼤值,就会是 0 。但是实际的结果应该是数组内的最⼤值。对于这种情况,我们需要特殊判断⼀下。
返回 sum == gmin ? fmax : max(fmax, sum - gmin)

代码实现

class Solution {
public:int maxSubarraySumCircular(vector<int>& nums) {int n = nums.size();int sum = 0;			// 整个数组的和vector<int> f(n+1);		// 以i为结尾,最大的子数组和vector<int> g(n+1);		// 以i为结尾,最小的子数组和int fmax = INT_MIN, gmin = INT_MAX;// 初始化f[0] = 0;g[0] = 0;// 填表for (int i = 1; i <= n; i++){f[i] = max(nums[i-1], nums[i-1] + f[i - 1]);g[i] = min(nums[i-1], nums[i-1] + g[i - 1]);fmax = max(fmax, f[i]);gmin = min(gmin, g[i]);sum += nums[i-1];}return sum == gmin ? fmax : max(fmax, sum - gmin);}
};

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

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

相关文章

设计模式(十) - 工厂方式模式

前言 在此前的设计模式&#xff08;四&#xff09;简单工厂模式中我们介绍了简单工厂模式&#xff0c;在这篇文章中我们来介绍下工厂方法模式&#xff0c;它同样是创建型设计模式&#xff0c;而且又有些类似&#xff0c;文章的末尾会介绍他们之间的不同。 1.工厂方法模式简介 …

C# TesseractOCR识别身份证号

https://github.com/tesseract-ocr/tessdata 新建控制台项目并添加包 Tesseract和Tesseract.Drawing 下载训练的模型 地址 代码实现 using Tesseract;var filePath "F:\\Desktop\\韦小宝.png"; var exePath AppDomain.CurrentDomain.BaseDirectory; var …

机器视觉运动控制一体机在光伏汇流焊机器人系统的解决方案

一、市场应用背景 汇流焊是光伏太阳能电池板中段加工工艺&#xff0c;其前道工序为串焊&#xff0c;在此环节流程中&#xff0c;需要在多个太阳能电池片表面以平行方式串焊多条焊带&#xff0c;形成电池串。串焊好的多组电池串被有序排列输送到汇流焊接工作台&#xff0c;通过…

接受回调函数的函数

直接上代码 const oneWord function (str) {return str.replace(/ /g, ).toLowerCase(); };const upperFirstWorld function (str) {const [first, ...others] str.split( );return [first.toUpperCase(), ...others].join( ); };// 高阶函数 const transformer function …

深度学习 精选笔记(3)线性神经网络-线性回归

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

workon把pyhton环境切换为python3.7环境配置

重新创建虚拟环境 创建workon的虚拟环境&#xff08;注意修改中文&#xff09; 注&#xff1a;-p后面的路径为你需要的python版本的python.exe执行文件 mkvirtualenv -p C:\Users\用户名\AppData\Local\Programs\Python\Python37\Python.exe 环境名进入环境&#xff08;注意…

代码随想录Day63 |503.下一个更大元素II 42. 接雨水

代码随想录Day63 |503.下一个更大元素II 42. 接雨水 503.下一个更大元素II42.接雨水双指针单调栈 503.下一个更大元素II 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a; 单调栈&#xff0c;成环了可怎么办&#xff1f;LeetCode&#xff1a;503.下一个更大元素II 状态 单…

基于Java SSM框架实现高考填报信息系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现高考填报信息系统演示 JAVA简介 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterprise JavaBeans&#xff09;的全面支持&#xff0c;java servlet API&#xff0c;JSP&#xff08;java serv…

OpenAI 与开源多语言嵌入模型

原文地址&#xff1a;OpenAI vs Open-Source Multilingual Embedding Models 选择最适合您的数据的模型 2024 年 2 月 25 日 OpenAI最近发布了他们的新一代embedding模型&#xff0c;称为embeddingv3&#xff0c;他们描述是他们性能最好的embedding模型&#xff0c;具有更高…

企业微信主体怎么转让给别人?

企业微信变更主体有什么作用&#xff1f;当我们的企业因为各种原因需要注销或已经注销&#xff0c;或者运营变更等情况&#xff0c;企业微信无法继续使用原主体继续使用时&#xff0c;可以申请企业主体变更&#xff0c;变更为新的主体。企业微信变更主体的条件有哪些&#xff1…

Zookeeper启动报错排查

前言&#xff1a;生产linux部署的zookeeper&#xff0c;执行启动脚本后&#xff0c;还是无法使用&#xff0c;故进行重启排查 在zookeeper的bin目录下执行 ./zkServer.sh start-foreground 可实时查看启动日志排查问题 根据上面的日志可以看出&#xff0c;是zoo.cfg配置文件里…

绿幕背景抠图SDK解决方案

随着影像技术的日益发展和普及&#xff0c;视频制作和图像处理已经成为众多行业不可或缺的一环。美摄科技&#xff0c;作为业内领先的影像技术提供商&#xff0c;针对企业需求&#xff0c;推出了全新的绿幕背景抠图SDK解决方案&#xff0c;旨在为企业提供更加高效、精准的影像处…

Java技术发展历程中的六大春天:从Web开发到大数据战略

Java技术发展历程中的六大春天&#xff1a;从Web开发到大数据战略 Six Springs in the Development Journey of Java Technology: From Web Development to Big Data Strategy 自Java诞生以来&#xff0c;其发展历程中出现了多个关键的“春天”时刻&#xff0c;每一段历程都伴随…

flashback to timestamp 耗时

flashback pluggable database XX to timestamp to_date(2024-02-26 13:11:56,yyyy-mm-dd hh24:mi:ss); 1TB 花费2小时&#xff0c;如果做了还原点好像很快 select trunc( a.FIRST_TIME,HH24),count(*) from v$flashback_database_logfile a group by trunc( a.FIRST_TIME,…

ADC制剂生产过程中的微粒控制-隧道烘箱在线粒子监测系统 中邦兴业

ADC制剂生产过程中的污染和交叉污染控制需要从多个方面入手&#xff0c;包括生产环境、设备、原辅料、生产过程、人员卫生和培训以及微生物监控等。只有全面、有效地实施这些控制措施&#xff0c;才能确保ADC制剂的质量和安全性。 ADC制剂生产过程中的微粒控制 ADC制剂生产中的…

StarRocks之监控管理(内含DashBoard模板)

先看下最终效果图 架构 Prometheus 是一个拥有多维度数据模型的、灵活的查询语句的时序数据库。它可以通过 Pull 或 Push 采集被监控系统的监控项,存入自身的时序数据库中。并且通过丰富的多维数据查询语言,满足用户的不同需求。 Grafana 是一个开源的 Metric 分析及可视化系…

右值引用的意义 以及 move函数,forward完美转发

文章目录 右值引用的意义move 函数forward 完美转发 右值引用的意义 直观意义&#xff1a; 为临时变量续命&#xff0c;也就是为右值续命&#xff0c;因为右值在表达式结束后就消亡了&#xff0c;如果想继续使用右值&#xff0c;那就会动用昂贵的拷贝构造函数。&#xff08;关…

k8s 进阶实战笔记 | NFS 动态存储类的部署与使用

文章目录 NFS 动态存储类的部署与使用演示环境说明NFS subdir external provisioner准备 NFS 服务器手动部署 NFS Subdir External Provisioner部署 StorageClass验证使用更多信息 NFS 动态存储类的部署与使用 演示环境说明 演示环境信息&#xff1a;单机K3s 1.28.2 操作系统…

配置用户通过IPv6方式上网

组网需求 运营商为企业分配了WAN侧的IPv6地址1111:2222:A0EE:6::2/64和LAN侧的IPv6地址1111:3333:E840:2::1/64&#xff0c;企业通过运营商提供的IPv6地址配置上网。 图1 配置用户通过IPv6方式上网 操作步骤 1、在IPS上的配置 interface GigabitEthernet0/0/4 ipv6 enable…

代码随想录Leetcode377. 组合总和 Ⅳ

题目&#xff1a; 代码(首刷看解析 2024年2月27日&#xff09;&#xff1a; class Solution { public:// 思路&#xff1a;动态规划int combinationSum4(vector<int>& nums, int target) {// 1条件判断:无// 2定义dp 初始化 总和为target的数量vector<int> dp…