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);
    }
};

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

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

相关文章

Qt QWidget 简约美观的加载动画 第五季 - 小方块风格

给大家分享两个小方块风格的加载动画 &#x1f60a; 第五季来啦 &#x1f60a; 效果如下: 一个三个文件,可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <QGridLayout> int main(int argc, char *arg…

vulnhub----hackme2-DHCP靶机

文章目录 一&#xff0c;信息收集1.网段探测2.端口扫描3.目录扫描 二&#xff0c;信息分析三&#xff0c;sql注入1.判断SQL注入2.查询显示位3.查询注入点4.查询库5.查询表6.查字段7. 查user表中的值8.登陆superadmin用户 四&#xff0c;漏洞利用文件上传命令执行蚁剑连接 五&am…

SwiftUI中的 WebView

SwiftUI中的WebView是一个用于显示网页内容的视图。它是使用WebKit框架的一个封装。 要在SwiftUI中使用WebView&#xff0c;你可以按照以下步骤操作&#xff1a; 首先&#xff0c;导入WebKit框架&#xff1a; import WebKit创建一个WebView实例&#xff1a; struct WebView…

将文件从windows传入到ubuntu

实现效果图 2.方法&#xff1a; 2.1打开 Ubuntu 的终端窗口&#xff0c;然后执行如下命令来安装 FTP 服务 输入&#xff1a;sudo apt-get install vsftpd 等待软件自动安装&#xff0c;安装完成以后使用如下 VI 命令打开/etc/vsftpd.conf&#xff0c;命令如下&#xff1a;su…

qt5.15 升级 qt 6.5 部分问题 解决修复

报错 QT5_USE_MODULES 升级 QT6_ADD_RESOURCES qt_add_resources Compiles binary resources into source code. CMake Commands in Qt6 Core | Qt Core 6.6.2

CrossOver24.0新功能介绍以及2024使用激活教程

CrossOver24简介 CrossOver 24.0 Mac/Linux版是一款功能强大的类虚拟机软件。CrossOver 24.0 for Mac/Linux软件能够帮助在Mac/Linux系统上使用Windows系统所支持的软件&#xff0c;实现各个系统之间的无缝集成。通过crossover 24.0软件用户可以进行跨平台的复制粘贴和文件互通…

刷题日记 | 字符串扩容和增强型for循环

for(char c:s)遍历字符串 增强型for循环 C for(char c:s)遍历字符串 增强型for循环_c for (char c : s)-CSDN博客 字符串使用前要进行扩容 reserve函数 【CString类成员函数辨析】resize(),size(),capacity(),reserve()函数的解析与对比_c reserve函数-CSDN博客 a.size() 用来…

ES小总结

组合查询 FunctionScoreQueryBuilder functionScoreQuery QueryBuilders.functionScoreQuery(boolQuery,new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("isAD",true),Score…

顺丰科技2024届春季校园招聘常见问题解答及SHL测评题库

顺丰科技2024届春季校园招聘常见问题解答及SHL测评题库 Q&#xff1a;顺丰科技2024届校园招聘面向对象是&#xff1f; A&#xff1a;2024届应届毕业生&#xff0c;毕业时间段为2023年10月1日至2024年9月30日&#xff08;不满足以上毕业时间的同学可以关注顺丰科技社会招聘或…

代码随想录算法训练营第四一天 | 背包问题

目录 背包问题01背包二维dp数组01背包一维 dp 数组&#xff08;滚动数组&#xff09;分割等和子集 LeetCode 背包问题 01背包 有n件物品和一个最多能背重量为 w 的背包&#xff0c;第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#x…

5Why分析法不会用?别担心,精益企业管理咨询公司助你解锁新技能

近年来&#xff0c;为了保持竞争力&#xff0c;许多企业开始转向精益管理&#xff0c;而5Why分析法则是实现这一目标的关键工具之一。然而&#xff0c;对于许多初学者来说&#xff0c;5Why分析法可能显得陌生和复杂。今天&#xff0c;天行健精益企业管理咨询公司就来分享如何运…

NoSQL数据库介绍

目录 一、发展历史 二、什么是NoSQL&#xff1f; 三、为什么使用NoSQL&#xff1f; 四、NoSQL vs. RDBMS 五、NoSQL的四种类型 键值存储 文档存储 列式存储 图形存储 六、NoSQL的优缺点 七、NoSQL的特点 灵活的可扩展性 灵活的数据模型 与云计算紧密融合 大数据量…

Python爬虫中的单线程、多线程问题(文末送书)

前言 在使用爬虫爬取数据的时候&#xff0c;当需要爬取的数据量比较大&#xff0c;且急需很快获取到数据的时候&#xff0c;可以考虑将单线程的爬虫写成多线程的爬虫。下面来学习一些它的基础知识和代码编写方法。 一、进程和线程 进程可以理解为是正在运行的程序的实例。进…

【沐风老师】3DMAX快速布尔插件使用方法讲解

3DMAX快速布尔插件FastBool使用教程 3DMAX快速布尔插件FastBool&#xff0c;是一个基于布尔运算的小型但功能非常强大的插件。工作方便快捷。 【版本要求】 3dMax2017-2024&#xff08;不仅限于此范围&#xff09; 【安装方法】 该插件无需安装&#xff0c;使用时直接拖动插件…

使用 Verilog 做一个可编程数字延迟定时器 LS7211-7212

今天的项目是在 Verilog HDL 中实现可编程数字延迟定时器。完整呈现了延迟定时器的 Verilog 代码。 所实现的数字延迟定时器是 CMOS IC LS7212&#xff0c;用于生成可编程延迟。延迟定时器的规格可以在这里轻松找到。基本上&#xff0c;延迟定时器有 4 种操作模式&#xff1a;…

深度学习目标检测】二十、基于深度学习的雾天行人车辆检测系统-含数据集、GUI和源码(python,yolov8)

雾天车辆行人检测在多种场景中扮演着至关重要的角色。以下是其作用的几个主要方面&#xff1a; 安全性提升&#xff1a;雾天能见度低&#xff0c;视线受阻&#xff0c;这使得驾驶者和行人在道路上的感知能力大大降低。通过车辆行人检测技术&#xff0c;可以在雾天条件下及时发现…

振弦采集仪在桥梁岩土工程中的应用与效果评价

振弦采集仪在桥梁岩土工程中的应用与效果评价 河北稳控科技振弦采集仪是一种用于结构动力测试的仪器&#xff0c;也可以应用于桥梁和岩土工程中。其主要作用是通过测量结构的振动特性&#xff0c;分析结构的动态行为&#xff0c;评估结构的健康状况和性能。 在桥梁工程中&…

【非比较排序】计算排序算法

目录 CountSort计数排序 整体思想 图解分析 代码实现 时间复杂度&优缺分析 CountSort计数排序 计数排序是一种非比较排序&#xff0c;不需要像前面的排序一样去比较。 计数排序的特性总结&#xff1a; 1. 计数排序在数据范围集中时&#xff0c;效率很高&#xff0c;但…

【element+vue】点击加号增加一行,点击减号删除一行

代码实现&#xff1a; 页面部分&#xff1a; vueelement 备注&#xff1a;v-if “i>0” &#xff08;保证第一行不出现减号&#xff09; <div v-for"(item,i) in studentList"><el-form-item label"学生:" prop"name"><el-i…

基于Java SSM框架实现家庭食谱管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现家庭食谱管理系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个家庭食谱管理系统 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论…