LeetCode 918. Maximum Sum Circular Subarray【数组,动态规划】中等

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

给定一个长度为 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 * 10^4
  • -3 * 10^4 <= nums[i] <= 3 * 10^4
    ​​​​​​​

解法 动态规划

首先要掌握好53题,最大子数组和的动态规划解法.

这题一共有两种情况(也就是比53题多了一种「最大非空子数组和是首尾连接」的情况) 下面的这个子数组指最大和的子数组。

  • 第一种情况:这个子数组不是环状的,就是说首尾不相连。
  • 第二种情况:这个子数组一部分在首部,一部分在尾部,我们可以将这第二种情况转换成第一种情况。如下图:

所以这最大的环形子数组和 = max ⁡ ( 最大子数组和 ,  数组总和 − 最小子数组和 ) \max(最大子数组和,\ 数组总和-最小子数组和) max(最大子数组和, 数组总和最小子数组和)

证明:第二种情况(最大子数组是环形的) max ⁡ ( 前缀数组 + 后缀数组 ) = max ⁡ ( 数组总和 − s u b a r r a y ) = 数组总和 + max ⁡ ( − s u b a r r a y ) \max(前缀数组+后缀数组) = \max(数组总和 - subarray)\\ = 数组总和 + \max(-subarray) max(前缀数组+后缀数组)=max(数组总和subarray)=数组总和+max(subarray) 数组总和是不变的,直接提出来 = 数组总和 − min ⁡ ( s u b a r r y ) = 数组总和 - \min(subarry) =数组总和min(subarry) s u b a r r a y subarray subarray 指的是前缀数组和后缀数组中间的数组。再把负号提出来, max ⁡ \max max 变成 m i n min min

极端情况:如果说这数组的所有数都是负数,由于要返回非空子数组的和,那么上面的公式还需要变一下,因为这时,对于上面的情况①, s u m sum sum 会等于数组中的最大值,而情况② s u m = 0 sum=0 sum=0(最小的子数组就是本数组, t o t a l − t o t a l = 0 total-total=0 totaltotal=0 )。所以多加一个Case,判断最大子数组和是否小于0,小于0,直接返回该 m a x S u b A r r a y maxSubArray maxSubArray

t o t a l total total 为数组的总和, m a x S u m maxSum maxSum 为最大子数组和, m i n S u m minSum minSum 为最小子数组和, c u r M a x curMax curMax包含当前元素的最大子数组和, c u r M i n curMin curMin包含当前元素的最小子数组和。

class Solution {
public:
    int maxSubarraySumCircular(vector<int>& nums) {
        int total = 0, maxSum = nums[0], curMax = 0, minSum = nums[0], curMin = 0;
        for (int num : nums) {
            curMax = max(curMax + num, num);
            maxSum = max(maxSum, curMax);
            curMin = min(curMin + num, num);
            minSum = min(minSum, curMin);
            total += num; 
        }
        return maxSum > 0 ? max(maxSum, total - minSum) : maxSum;
    }
};

复杂度分析:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

谷粒商城篇章5 ---- P173-P192 ---- 检索服务【分布式高级篇二】

目录 1 检索服务 1.1 搭建页面环境 1.1.1 引入依赖 1.1.2 将检索页面放到gulimall-search的src/main/resources/templates/目录下 1.1.3 调整搜索页面 1.1.4 将静态资源放到linux的nginx相关映射目录下/root/docker/nginx/html/static/ search/ 1.1.5 SwitchHosts配置域…

Zookeeper的基本概念以及安装

Zookeeper简介 Zookeeper是一个分布式的(多台机器同时干一件事情),开源的分布式应用程序协调服务,是Google公司Chubby产品,是Hadoop和Base重要的组件,.它是一个分布式应用程序提供一致性的服务的软件,提供的功能包括:配置服务,域名服务,分布式同步,组服务等 Zookeeper目…

大数据课程C4——ZooKeeper结构运行机制

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解Zookeeper的特点和节点信息&#xff1b; ⚪ 掌握Zookeeper的完全分布式安装 ⚪ 掌握Zookeeper的选举机制、ZAB协议、AVRO&#xff1b; 一、Zookeeper-简介 1. 特点…

TRT4-trt-integrate - 3 使用onnxruntime进行onnx的模型推理过程

前言&#xff1a; onnx是microsoft开发的一个中间格式&#xff0c;而onnxruntime简称ort是microsoft为onnx开发的推理引擎。允许使用onnx作为输入进行直接推理得到结果。 py接口的推理过程&#xff1a; main函数&#xff1a; if __name__ "__main__":session onn…

模拟量采集S_ITR函数(信捷C语言FC)

模拟量采集和转换函数非常简单,这里不再介绍,想了解具体算法的可以查看下面博客文章: PLC模拟量输入 模拟量转换FC S_ITR_博途模拟量转换程序_RXXW_Dor的博客-CSDN博客模拟量采集、工业现场应用特别广泛、大部分传感器的测量值和输出信号都是线型关系,所以我们可以利用线性…

JPA连接达梦数据库导致auto-ddl失效问题解决

现象&#xff1a; 项目使用了JPA&#xff0c;并且auto-ddl设置的为update&#xff0c;在连接达梦数据库的时候&#xff0c;第一次启动没有问题&#xff0c;但是后面重启就会报错&#xff0c;发现错误为重复建表&#xff0c;也就是说已经建好的表没有检测到&#xff0c;…

mysql用户添加

一、连接mysql服务 mysql -u root -p 二、查询用户表 use mysql &#xff1b; SELECT User, Host FROM mysql.user; 三、新增用户并授权 Create USER dev4rw% IDENTIFIED WITH mysql_native_password BY 新密码; GRANT ALL PRIVILEGES ON *.* TO dev4rw% WITH GRANT OP…

【Spring MVC学习】连接 接收请求参数 响应返回参数

目录 前言&#xff1a;认识Spring MVC &#x1f337;1、什么是MVC&#xff1f; 一、建立连接&#xff08;5个注解&#xff09; &#x1f337;1、RequestMapping注解:注册接⼝的路由映射&#xff08;默认返回页面&#xff09; &#x1f337;2、ResponseBody注解&#xff1a…

【C++】开源:Redis数据库配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Redis数据库配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c…

智能驾驶中的数据标注

目前&#xff0c;各大自动驾驶汽车制造商都在通过获取高质量的训练数据最大化其数据资产的投入产出比。在海量的智能驾驶数据面前&#xff0c;如何让每个数据都有存在意义&#xff1f;从《数字商业时代》对澳鹏Appen(中国)高级产品总监张童皓的采访中&#xff0c;你或许能找到一…

MySQL数据库远程访问权限设置

MySQL数据库远程访问权限设置 对于初学者小伙伴来说&#xff0c;我们安装mysql到本地服务&#xff0c;再用一些图形化工具链接。一般情况下我们都能链接成功&#xff1b;但是、在模拟真实的环境中我们的数据库不可能直接安装在本地机器上&#xff0c;大多数是在云服务器上&…

头戴式玩具外贸出口EN71检测报告需要什么资料?

EN71是欧盟市场玩具类产品的规范标准。儿童是全社会最关心和爱护的群体&#xff0c;儿童普遍喜爱的玩具市场发展迅猛&#xff0c;同时各类玩具由于各方面质量问题给儿童带来的伤害也时有发生&#xff0c;因此世界各国对本国市场上的玩具的要求正日益变得严格。许多国家都就这些…

Docker Compose容器的快速编排

Docker Compose容器的快速编排 一、Docker Compose简介1、Docker Compose是什么2、Docker Compose三大概念 二、Docker Compose 安装与操作1、环境安装2、YAML文件格式及编写注意事项3、Docker Compose配置常用字段4、Docker Compose常用命令5、Docker Compose文件结构6、删除创…

Java带符号右移(>>)、不带符号右移(>>>)

Java的右移涉及带符号右移&#xff08;>>&#xff09;、不带符号右移&#xff08;>>>&#xff09;。 对于正数&#xff0c;因为符号位是0&#xff0c;带符号右移和不带符号右移左侧都用0填充&#xff0c;所以结果相同。 对于负数&#xff0c;因为符号位是1&…

四,Eureka 第四章

2.1.3 增加依赖 <!--添加依赖--><dependencies><!--Eureka Server--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>&l…

C++笔记之memset分析

C笔记之memset分析 code review! 文章目录 C\笔记之memset分析1.介绍2.误区总结3.代码一&#xff0c;char数组和uint8_t使用memset4.代码三&#xff0c;int数组使用memset 1.介绍 2.误区总结 参考文章&#xff1a;Cmemset踩坑 3.代码一&#xff0c;char数组和uint8_t使用mem…

网络安全进阶学习第七课——文件包含漏洞

文章目录 一、文件包含概念二、文件包含漏洞原理三、文件包含分类文件包含分为两种&#xff1a; 四、与文件包含相关的配置文件&#xff1a;&#xff08;php.ini文件&#xff09;五、与文件包含有关的函数1、include()2、include_once()3、require()4、require_once() 六、文件…

C# WPF项目创建(基于VS 2019介绍)

1.打开VS&#xff0c;选择《创建新项目》 2.选择《WPF应用》&#xff0c;这里设计两个有.NET Framework框架和.NET core 框架&#xff0c;如图所示&#xff1a; 区别&#xff1a; .NET Framework 框架只能在windows下使用 .NET core 框架支持linux 下运行 3. 项目名称根据需…

qsort的使用及模拟实现

qsort函数是C语言库中提供的一种快速排序&#xff0c;头文件是stdlib.h qsort的使用 qsort函数需要四个参数&#xff1a; 1.排序的起始位置的地址&#xff08;数组名&#xff09;: arr 2.排序元素的个数&#xff1a; sizeof&#xff08;arr)/sizeof(arr[0]) 3.排序元素…

Windows如何安装Django及如何创建项目

目录 1、Windows安装Django--pip命令行 2、创建项目 2.1、终端创建项目 2.2、在Pycharm中创建项目 2.3、二者创建的项目有何不同 2.4、项目目录说明 1、Windows安装Django--pip命令行 安装Django有两种方式&#xff1a; pip命令行【推荐--简单】手动安装【稍微复杂一丢丢…