【动态规划】力扣918. 环形子数组的最大和

news2024/11/23 22:15:00

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

在这里插入图片描述

动态规划

class Solution {
public:
    int maxSubarraySumCircular(vector<int>& nums) {
        int n = nums.size();
        vector<int> leftMax(n);
        int pre = nums[0], res = nums[0], leftSum = nums[0] ;
        leftMax[0] = nums[0];
        for(int i = 1; i < n; i++){
            pre = max(nums[i], pre + nums[i]);
            res = max(res, pre);
            leftSum += nums[i];
            leftMax[i] = max(leftMax[i-1], leftSum);
        }

        int rightSum = 0;
        for(int i = n - 1; i > 0 ; i--){
            rightSum += nums[i];
            res = max(res, rightSum + leftMax[i-1]);
        }
        return res;
    }
};

时间复杂度:O(n),其中 n 是 nums 的长度。求解第一种情况的时间复杂度为 O(n),求解 leftMax 数组和枚举后缀的时间复杂度为 O(n),因此总的时间复杂度为 O(n)。

空间复杂度:O(n),其中 n 是 nums 的长度。过程中我们使用 leftMax 来存放最大前缀和。

用动态规划的思路来讲,是要列出可能的情况。在这道题中一种情况是不跨越尾部,也就是正常的子段,另外一种是跨越尾部。针对特殊的跨越尾部的情况,使用leftMax来记录第 i 个元素之前的最大子段和,然后从右到左遍历数组,最后比较两种情况的最大值即可。

取反

class Solution {
public:
    int maxSubarraySumCircular(vector<int>& nums) {
        int n = nums.size();
        int sum = nums[0];
        int preMax = nums[0], resMax = nums[0];
        int preMin = nums[0], resMin = nums[0];
        for(int i = 1; i < n; i++){
            preMax = max(nums[i], preMax + nums[i]);
            resMax = max(resMax, preMax);
            preMin = min(nums[i], preMin + nums[i]);
            resMin = min(resMin, preMin);
            sum += nums[i];
        }

        if(resMax < 0){
            return resMax;
        }
        else{
            return max(resMax, sum - resMin);
        }
    }
};

时间复杂度:O(n),其中 n 是 nums 的长度。
空间复杂度:O(1)。过程中只是用到了常数个变量。

这是一个更加巧妙的思路,并且有更低的空间复杂度。他的思想是所有数组元素之和减去中间的一段最小子段和,剩下的部分就是最大的经过头尾的子段和,再与正常子段和比较即可。要注意的是,当resMax < 0 的时候,sum - resMin返回的是一个空数组,这时候只要返回resMax。

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

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

相关文章

Jmeter性能压测4000并发

性能测试的底层逻辑 程序为什么会有性能问题 用户操作 客户端&#xff08;web/app/小程序&#xff09;触发网络请求&#xff0c;服务器处理大量网络请求代码运行需要大量服务器资源&#xff08;CPU、内存、网络、磁盘等等&#xff09; 资源不是无限&#xff0c;硬件配置不是随…

python-分享篇-英文短文自动分词写入文本文件

文章目录 准备代码效果 准备 代码 import string f open(./data/split.txt) sf.read() str1s.title() print(str1) print("".join([s for s in str1.splitlines(True) if s.strip()])) list1 str1.split() # 采用默认分隔符进行分割 #字符串列表去重 l1list(set(l…

lvs的dr模式综合实践

目录 ​编辑虚拟机准备工作 ​编辑​编辑​编辑 配置过程 配置client主机 配置router主机 配置lvs主机&#xff08;vip使用环回来创建&#xff09; 配置server1主机&#xff08;vip使用环回来创建&#xff09; 配置server2主机&#xff08;vip使用环回来创建&#xff0…

SpringBoot+Mybatis 分页

无论多数据源,还是单数据源,分页都一样,刚开始出了点错,是因为PageHelper的版本问题 这里用的SpringBoot3 SpringBoot2应该是没有问题的 相关代码 dynamic-datasourceMybatis多数据源使用-CSDN博客 依赖 <?xml version"1.0" encoding"UTF-8"?&g…

Maven+Tomcat环境搭建

Maven Maven框架的作用 1.在JavaWeb开发中需要使用大量的jar包,这些jar包需要手动导入 2.自动导入和配置jar包 Maven项目架构管理工具 方便导入jar包 Maven的核心思想:约定大于配置 有约束不要去违反 Maven会规定好你该如何去编写java代码,必须按照规范来 安装流程 1…

Godot学习笔记8——PONG游戏制作

目录 一、小球 二、地图 三、积分系统 四、玩家场景 五、导出与发布 PONG是1972年由雅达利公司推出的游戏&#xff0c;主要玩法为玩家控制两个可以上下移动的板子击打屏幕中不断运动的球 一、小球 我们首先创建一个“Area2D”场景&#xff0c;在它下方创建“Collisi…

好书推荐|复旦大学专家团队著《大规模语言模型:从理论到实践》(附PDF)

前言 在这个迅猛发展且复杂多变的技术领域&#xff0c;掌握大型模型的理论核心并有效地将其应用于实践&#xff0c;对许多人来说是一项艰巨的任务。为此&#xff0c;《大规模语言模型&#xff1a;从理论到实践》一书应运而生。本书由复旦大学计算机科学技术学院知名教授张奇领…

将增强型乳腺摄影添加到断层合成中用于有乳腺癌个人病史女性的乳腺癌检测:| 文献速递-基于深度学习的乳房、前列腺疾病诊断系统

Title 题目 Addition of Contrast-enhanced Mammography to Tomosynthesis for Breast Cancer Detection in Women with a Personal History of Breast Cancer: 将增强型乳腺摄影添加到断层合成中用于有乳腺癌个人病史女性的乳腺癌检测&#xff1a; Background 背景 Dig…

【黄啊码】什么是SD?SD的使用技巧

目录 SD的简介 SD的优势 1、不需要绘画基础&#xff0c;便能绘制精美的图片&#xff0c;插画 2、StableDiffusion不仅用于静态图像生成&#xff0c;还可应用于动态图像和视频创作&#xff0c;拓宽了AI绘画的应用领域。 3、快速发展&#xff0c;成熟的社区——帮助使用者…

Linux系统 腾讯云服务/宝塔面板安装《最新版本2024》禅道开源版本20.2

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 有两种方式1.自带有服务器安装和2.使用禅道官方的服务器免费使用 第一种&#xff1a;免费的提供5人使用&#xff0c;存储的数据大小也是有限制的范围的 禅道下载 - 禅道项目管理软件 下滑页面就能…

大事件前端篇JavaScript导入导出

前置知识&#xff1a; 呃呃呃......有那么一点点&#xff1f;&#xff1f;但不多。。。。不管&#xff0c;先学&#xff0c;不会的时候再去看响应的知识点吧。 补充一个模块化相关的知识点&#xff1a;JavaScript-导入导出 JS提供的导入导出机制&#xff0c;可以实现按需导…

尚品汇-创建ES索引库(二十七)

目录&#xff1a; &#xff08;1&#xff09;商品检索功能介绍 &#xff08;2&#xff09;根据业务搭建数据结构 &#xff08;3&#xff09;nested 介绍 &#xff08;4&#xff09;搭建service-list服务 &#xff08;5&#xff09;构建实体与es mapping建立映射关系 &…

前端常用的几个工具网站

觉得不错的前端工具类网站 1、Grid布局生成 https://cssgrid-generator.netlify.app 2、拟物按钮样式生成 https://neumorphism.io 3、玻璃形态效果 在线制作CSS玻璃形态 4、一些Button、checkBox、switch、card的css样式 零代码 - 精美CSS样式库 5、CSS阴影生成 在线创建…

python游戏开发之五子棋游戏制作

五子棋是一种源自中国的传统棋类游戏&#xff0c;起源可以追溯到古代。它是一种两人对弈的游戏&#xff0c;使用棋盘和棋子进行。棋盘通常是一个 1515 的网格&#xff0c;棋子分为黑白两色&#xff0c;双方轮流在棋盘上落子。游戏的目标是通过在棋盘上落子&#xff0c;使自己的…

ViT和SwinTransformer详解

ViT是Google brain发表于ICLR21上的工作&#xff0c;开创性将transformer用在vision领域&#xff0c;且图像识别性能超CNN&#xff0c;至今引用3.8w&#xff1b;原文&#xff1a;https://arxiv.org/pdf/2010.11929 SwinTransformer是微软亚洲研究院发表于ICCV21上&#xff0c;…

使用python CodeGeeX 辅助数据处理xml

1 背景:手头上有N 张算是开发完成的报表,但是由于每个报表是不同的人开发的,每个人不同的编码风格,准备看看报表是否都定义了Title,是否都定义了报表的描述,是否有不带where条件的前台查询,是否同一个参数定义一致.现在AI 代码助手功能据说很强大了,试试描述需求让机器来辅助编…

【中项】系统集成项目管理工程师-第10章 项目整合管理-10.3指导与管理项目工作

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

常用在线 Webshell 查杀工具推荐

一、简介 这篇文章将介绍几款常用的在线 Webshell 查杀工具&#xff0c;包括长亭牧云、微步在线云沙箱、河马和VirusTotal。每个工具都有其独特的特点和优势&#xff0c;用于帮助用户有效检测和清除各类恶意 Webshell&#xff0c;保障网站和服务器的安全。文章将深入探讨它们的…

实现自定义QDateEdit可删除日期值

在Qt框架中&#xff0c;QDateEdit是一个用于编辑日期的控件&#xff0c;如果想要删除QDateEdit不是特别好做&#xff0c;如果直接获取QDateEdit中的QLineEdti并设置显示删除按钮&#xff08;代码如下所示&#xff09;&#xff0c;删除按钮会一直显示&#xff0c;效果并不好&…

SIP 消息的路由和 7 个相关的 Header IMS-HSS 中的透明数据及非透明数据(VoNR、VoLTE均用)

目录 1. SIP 消息的路由和 7 个相关的 Header 1.1 SIP 消息路由相关的7个Header 1.2 理解 Record-Route 和 Route 1.3 Record-Route 和 Route 流程举例 1.4 SIP 请求消息的路由原则 1.5 SIP 请求消息路由举例 1.6 SIP 请求消息路由原则和流程举例 2. IMS-HSS 中的透明数…