【Kadane】Leetcode 918. 环形子数组的最大和【中等】

环形子数组的最大和

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

解题思路

要找到环形数组的最大子数组和,分为两种情况进行考虑:

子数组不跨越数组的末尾和开头:这种情况可以通过经典的Kadane算法求解,
Kadane算法可以在O(n)时间复杂度内找到数组中的最大子数组和。

子数组跨越数组的末尾和开头: 这种情况可以转换为一个求解问题,
即数组中的最小子数组和,然后用总和减去最小子数组和得到最大子数组和。
在这里插入图片描述

Java实现

public class MaxCircularSubarraySum {
    public int maxSubarraySumCircular(int[] nums) {

        // 计算不跨越数组末尾和开头的最大子数组和
        int maxKadane = kadane(nums);

        // 计算数组的总和
        int totalSum = 0;
        for (int num : nums) {
            totalSum += num;
        }

        // 计算最小子数组和
        int minKadane = kadaneMin(nums);

        // 如果数组中的所有元素都是负数,则返回 Kadane 算法的结果
        if (totalSum == minKadane) {
            return maxKadane;
        } else {
            return Math.max(maxKadane, totalSum - minKadane);
        }
    }

    // Kadane 算法,计算最大子数组和
    private int kadane(int[] nums) {
        //记录以当前元素结尾的最大子数组和
        int maxEndingHere = nums[0];
        //记录到目前为止找到的最大子数组和
        int maxSoFar = nums[0];
        for (int i = 1; i < nums.length; i++) {
            maxEndingHere = Math.max(nums[i], maxEndingHere + nums[i]);
            maxSoFar = Math.max(maxSoFar, maxEndingHere);
        }
        return maxSoFar;
    }

    // 计算最小子数组和
    private int kadaneMin(int[] nums) {
        //记录以当前元素结尾的最大子数组和,记录到目前为止找到的最小子数组和
        int minEndingHere = nums[0], minSoFar = nums[0];
        for (int i = 1; i < nums.length; i++) {
            minEndingHere = Math.min(nums[i], minEndingHere + nums[i]);
            minSoFar = Math.min(minSoFar, minEndingHere);
        }
        return minSoFar;
    }

    // 测试用例
    public static void main(String[] args) {
        MaxCircularSubarraySum solution = new MaxCircularSubarraySum();
        int[] nums1 = {1, -2, 3, -2};
        int[] nums2 = {5, -9, 4, 4,-9,5};
        int[] nums3 = {3, -1, 2, -1};
        int[] nums4 = {3, -2, 2, -3};
        int[] nums5 = {-2, -3, -1};

        System.out.println(solution.maxSubarraySumCircular(nums1)); // 期望输出: 3
        System.out.println(solution.maxSubarraySumCircular(nums2)); // 期望输出: 10
        System.out.println(solution.maxSubarraySumCircular(nums3)); // 期望输出: 4
        System.out.println(solution.maxSubarraySumCircular(nums4)); // 期望输出: 3
        System.out.println(solution.maxSubarraySumCircular(nums5)); // 期望输出: -1
    }
}

时间空间复杂度

  • 时间复杂度:O(n),其中 n 是数组的长度。Kadane算法的复杂度为 O(n),我们在代码中调用了两次Kadane算法,以及一次求数组和的操作,总体时间复杂度为 O(n)。
  • 空间复杂度:O(1),除了输入数组外,使用的额外空间仅限于一些常量。

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

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

相关文章

云效codeup

云效codeup 什么是云效codeup云效codeup操作代码库代码托管代码检测代码提交代码评审代码迁移 使用感受及建议 什么是云效codeup 云效代码管理&#xff08;Codeup&#xff09;是阿里云云效一站式 BizDevOps 平台提供的自研代码管理服务&#xff0c;为企业提供代码托管、代码评…

mysql:1205-Lock wait timeout exceeded;try restarting transaction

1.现象 2.分析 使用下面sql在自带数据库的information_schema中查询,注意观察那些长时间开启事务又没完成的进程,然后根据进程的db、操作人、主机、事务开启时间和状态,来排查是什么情况导致的事务未完成(代码异常、执行时间超时等等);我这里是异步作业事务执行时间过长导致的 …

夏日炎炎,护牙不闲——口腔问诊小程序开发助你笑口常开

近年来&#xff0c;“口呼吸”、“牙齿矫正”、“美牙贴片”等词越来越多的出现在大众的视野中&#xff0c;口腔健康成为了人们关注的新热点。但是市面上的口腔诊所数量众多又参差不齐&#xff0c;如何选择最合适的口腔诊所是人们面对的新问题。为了有效解决这一现状&#xff0…

【计算机毕业设计】259基于微信小程序的医院综合服务平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

电影推荐系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;免费电影管理&#xff0c;付费电影管理&#xff0c;电影论坛管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;付费电影&#…

5.所有权

标题 一、概念二、规则三、示例3.1 变量作用域3.2 所有权的移交&#xff08;深拷贝与浅拷贝&#xff09;3.3 函数与所有权3.4 返回值与作用域3.5 引用的使用 四、切片(&str) 一、概念 所有权是Rust的核心特性。所有程序在运行时都必须管理它们使用计算机内存的方式。Rust的…

ComfyUI 快速搭建流程

相关地址 ComfyUIPytorch版本 环境准备 nvidia 3090 ----------------------------------------------------------------------------- | NVIDIA-SMI 515.65.01 Driver Version: 515.65.01 CUDA Version: 11.7 | |--------------------------------------------…

从源码分析 vllm + Ray 的分布式推理流程

一、前言 随着 LLM 模型越来越大&#xff0c;单 GPU 已经无法加载一个模型。以 Qwen-14B-Chat 模型为例&#xff0c;模型权重大概 28GB&#xff0c;但是单个 NVIDIA A10 仅有 24GB 显存。如果想要在 A10 上部署 Qwen-14B-Chat 模型&#xff0c;我们需要将模型切分后部署到 2 个…

三十二、 数据跨境传输场景下的 PIA 与数据出境风险自评估是一回事吗?

PIA 与数据出境风险自评估并不相同。PIA 是《个人信息保护法》第五十五条明确提出要求企业在向境外提供个人信息前应当开展的自评估工作&#xff0c;而数据出境风险自评估则是《评估办法》第五条提出的要求符合数据出境安全评估申报情形的企业在申报前应当开展的自评估工作。 换…

阿里云活动推荐:AI 应用 DevOps 新体验

活动简介 阿里云新活动&#xff0c;体验阿里云的云效应用交付平台。体验了下&#xff0c;总体感觉还不错。平台把常规的开发过程封装成了模板&#xff0c;部署发布基本都是一键式操作&#xff0c;并且对自定义支持的比较好。 如果考虑将发布和部署搬到云上&#xff0c;可以玩一…

后端项目实战--瑞吉外卖项目软件说明书

瑞吉外卖项目软件说明书 一、项目概述 瑞吉外卖项目是一个外卖服务平台&#xff0c;用户可以通过该平台浏览餐厅菜单、下单、支付以及追踪订单状态。产品原型就是一款产品成型之前的一个简单的框架&#xff0c;就是将页面的排版布局展现出来&#xff0c;使产品得初步构思有一…

高效处理风电时序数据,明阳集团的 TDengine 3.0 应用实录

作为全国 500 强企业&#xff0c;明阳集团在风电行业拥有领先实力。目前全球超过 800 个项目采用明阳各种型号风电机组&#xff0c;安装数量超过 15000 台。每台风电机组配备数百至上千个监测点&#xff0c;生成的时序数据每秒一条&#xff0c;每天产生亿级以上的数据量。这些数…

电商比价系统的搭建需要哪些方面着手准备?

搭建一个淘宝/京东比价系统所需的时间取决于多个因素&#xff0c;包括但不限于系统的复杂度、开发团队的规模与经验、数据源获取的难易程度、技术选型等。以下是一个大致的时间估计和考虑因素&#xff1a; 需求分析与设计&#xff1a; 确定系统的主要功能&#xff0c;如商品搜…

C# Web控件与数据感应之模板循环输出

目录 关于模板循环输出 准备数据源 ​范例运行环境 RepeatHtml 方法 设计与实现 如何获取模板内容 getOuterHtml 方法 getInnerHtml 方法 调用示例 小结 关于模板循环输出 数据感应也即数据捆绑&#xff0c;是一种动态的&#xff0c;Web控件与数据源之间的交互&…

Web学习_SQL注入_联合查询注入

UNION 操作符用于合并两个或多个 SELECT 语句的结果集&#xff0c; UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句 中的列名&#xff0c;并且UNION 内部的 SELECT 语句必须拥有相同数量的 列。 联合查询注入就是利用union操作符&#xff0c;将攻击者希望查询的语句…

VS2019+QT5.15调用动态库dll带有命名空间

VS2019QT5.15调用动态库dll带有命名空间 vs创建动态库 参考&#xff1a; QT调用vs2019生成的c动态库-CSDN博客 demo的dll头文件&#xff1a; // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DLL3_EXPORTS // 符号…

CST软件眼图工具Eye Diagram Tools (中)--- Classical流程

距离上次眼图介绍快两年了&#xff0c;由于上期已经将重点推荐的方法&#xff08;statistical流程&#xff09;介绍了&#xff0c;所以一直没急着涉及这个话题。 仿真实例011&#xff1a;眼图工具Eye Diagram Tools&#xff08;上&#xff09; 先总结一下之前介绍过的内容&am…

Java对象的序列化与反序列化

序列化和反序列化是什么 当两个进程远程通信时&#xff0c;彼此可以发送各种类型的数据。无论是何种类型的数据&#xff0c;都会以二进制序列的形式在网络上传送。比如&#xff1a;我们可以通过http协议发生字符串信息&#xff1b;我们也可以在网络上直接发生Java对象。发送方…

佐西卡在美国InfoComm 2024展会上亮相投影镜头系列

6月12日至14日&#xff0c;2024美国视听显示与系统集成展览会将在拉斯维加斯会议中心盛大开幕。这场北美最具影响力的视听技术盛会&#xff0c;将汇集全球顶尖的视听解决方案&#xff0c;展现专业视听电子系统集成、灯光音响等领域的最新技术动态。 在这场科技盛宴中&#xff0…

数据可视化后起之秀——pyecharts

题目一&#xff1a;绘制折线图&#xff0c;展示商家A与商家B各类饮品的销售额 题目描述&#xff1a; 编写程序。根据第9.3.1&#xff0c;绘制折线图&#xff0c;展示商家A与商家B各类饮品的销售额。 运行代码&#xff1a; #绘制折线图&#xff0c;展示商家A与商家B各类饮品的…