【力扣 - 最大子数组和】

题目描述

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

提示:

1 <= nums.length <= 10^5
-10^4 <= nums[i] <= 10^4

方法一:动态规划

思路和算法

在这里插入图片描述

代码

// Function to find the maximum sum of a contiguous subarray within the given array
int maxSubArray(int* nums, int numsSize) {int sum = 0; // Variable to store the current sum of the subarrayint maxAns = nums[0]; // Variable to store the maximum sum found so far// Iterate through the array to calculate the maximum subarray sumfor (int i = 0; i < numsSize; i++) {// Update the current sum by choosing the maximum between extending the subarray or starting a new subarraysum = fmax(sum + nums[i], nums[i]);// Update the maximum sum found so far by comparing with the current summaxAns = fmax(maxAns, sum);}return maxAns; // Return the maximum sum of a contiguous subarray
}

复杂度

时间复杂度:O(n),其中 n 为 nums 数组的长度。我们只需要遍历一遍数组即可求得答案。
空间复杂度:O(1)。我们只需要常数空间存放若干变量。

方法二:分治

思路和算法

这个分治方法类似于「线段树求解最长公共上升子序列问题」的 pushUp 操作。
在这里插入图片描述
在这里插入图片描述

代码

// Structure to store the status of a subarray
struct Status {int lSum; // Maximum sum of the left subarrayint rSum; // Maximum sum of the right subarrayint mSum; // Maximum sum of any subarray within the rangeint iSum; // Total sum of the subarray
};// Function to update the status after merging left and right subarrays
struct Status pushUp(struct Status l, struct Status r) {int iSum = l.iSum + r.iSum; // Total sum of merged subarraysint lSum = fmax(l.lSum, l.iSum + r.lSum); // Maximum sum of the left subarrayint rSum = fmax(r.rSum, r.iSum + l.rSum); // Maximum sum of the right subarrayint mSum = fmax(fmax(l.mSum, r.mSum), l.rSum + r.lSum); // Maximum sum of any subarrayreturn (struct Status){lSum, rSum, mSum, iSum}; // Return the updated status
}// Function to get the status of a subarray within the range [l, r]
struct Status get(int* a, int l, int r) {// Base case: when the range contains only one elementif (l == r) {return (struct Status){a[l], a[l], a[l], a[l]}; // Return the status for a single element}// Calculate the middle index of the rangeint m = (l + r) >> 1;// Recursively get the status of the left and right subarraysstruct Status lSub = get(a, l, m);struct Status rSub = get(a, m + 1, r);// Merge the status of left and right subarraysreturn pushUp(lSub, rSub);
}// Function to find the maximum sum of any subarray within the given array
int maxSubArray(int* nums, int numsSize) {// Get the status of the entire array and return the maximum subarray sumreturn get(nums, 0, numsSize - 1).mSum;
}

复杂度分析

在这里插入图片描述

题外话

「方法二」相较于「方法一」来说,时间复杂度相同,但是因为使用了递归,并且维护了四个信息的结构体,运行的时间略长,空间复杂度也不如方法一优秀,而且难以理解。那么这种方法存在的意义是什么呢?

对于这道题而言,确实是如此的。但是仔细观察「方法二」,它不仅可以解决区间 [0,n−1],还可以用于解决任意的子区间 [l,r] 的问题。如果我们把 [0,n−1] 分治下去出现的所有子区间的信息都用堆式存储的方式记忆化下来,即建成一棵真正的树之后,我们就可以在 O(log⁡n) 的时间内求到任意区间内的答案,我们甚至可以修改序列中的值,做一些简单的维护,之后仍然可以在 O(log⁡n) 的时间内求到任意区间内的答案,对于大规模查询的情况下,这种方法的优势便体现了出来。这棵树就是一种神奇的数据结构——线段树。

作者:力扣官方题解
链接:https://leetcode.cn/problems/maximum-subarray/solutions/228009/zui-da-zi-xu-he-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

相关文章

自动化测试过程中的手机验证码处理!

手机验证码登录很普遍了&#xff0c;那么在自动化测试的时候需要登录&#xff0c;登录不了就意味着很多自动化就没法执行下去了。 到底该怎么处理呢&#xff1f;其实并不难&#xff0c;我们先看下验证码的业务逻辑&#xff0c;在我们“点击获取验证码”按钮的时候&#xff0c;…

一学就懂:安装OLED透明屏拼接屏需要注意什么?

安装OLED透明屏拼接屏时&#xff0c;需要注意以下几个方面&#xff1a; 一、前期准备 测量和规划&#xff1a;对安装区域进行详细测量&#xff0c;确保安装区域的尺寸和结构符合OLED透明屏的要求。同时&#xff0c;规划好拼接屏的数量、位置以及布线和固定方案。 环境评估&am…

Weblogic 常规渗透测试环境

测试环境 本环境模拟了一个真实的weblogic环境&#xff0c;其后台存在一个弱口令&#xff0c;并且前台存在任意文件读取漏洞。分别通过这两种漏洞&#xff0c;模拟对weblogic场景的渗透。 Weblogic版本&#xff1a;10.3.6(11g) Java版本&#xff1a;1.6 弱口令 环境启动后…

(golang)切片何时会创建新切片或影响原切片

什么时候切片操作会影响原切片 // 1.切片后没有触发slice的扩容机制时 什么时候对切片操作会创建新切片不影响原切片 // 2.对切片头元素进行截取的时候 // 3.当使用append时&#xff0c;len > cap则会触发扩容机制 前置&#xff1a; //slice结构体 type SliceHeader struct…

指针篇章-(4)+qsort函数的模拟

学习目录 ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————…

​知识图谱:基于嵌入的模型(TransE 、TransH、TransR和TransD)

(一)TransE: Translating Embeddings for Modeling Multi-relational Data. Antoine Bordes, Nicolas Usunier, Alberto Garcia-Duran, Jason Weston, Oksana Yakhnenko. NIPS 2013. 论文地址:http://papers.nips.cc/paper/5071-translating-embeddings-for-modeling-multi-…

[论文笔记]跨语言摘要最新综述:典型挑战及解决方案

https://arxiv.org/abs/2203.12515 跨语言摘要是指为给定的一种语言(例如中文)的文档生成另一种语言(例如英文)的摘要。 图1:四个端到端框架的概述。XLS:跨语言摘要;MT:机器翻译;MS:单语摘要。虚线箭头表示监督信号。无框彩色方块表示相应任务的输入或输出…

Deep Learning for Detecting Robotic Grasps

链接&#xff1a;1301.3592.pdf (arxiv.org) 这个用于从单一RGB-D视图进行机器人抓取检测的算法包括以下步骤&#xff1a; 图像获取&#xff1a; 机器人获取包含待抓取对象的场景的RGB-D图像。 抓取评分&#xff1a; 使用小型深度网络对RGB-D图像中的潜在抓取进行评分。抓取以在…

如何才能做一名渗透测试人员?

学习实践&#xff0c;目前只有这路子&#xff0c;自学9月&#xff0c;成功入圈。下面说一下自己的学习路径&#xff0c;都是摸爬滚打&#xff0c;交了N份钱才学会的。 切记一定要先了解整个渗透测试的流程&#xff0c;记住整个流程口诀&#xff1a;信息收集&打点&#xff…

Linux:进程

进程 知识铺垫冯诺依曼体系结构操作系统&#xff08;OS&#xff09; 进程概念进程的查看ps 命令获取进程 pid文件内查看进程终止进程的方式kill命令快捷键 进程的创建 forkfork 返回值问题 进程状态运行状态 &#xff1a;R休眠状态&#xff1a;S &#xff08;可中断&#xff09…

Python实用工具:三维坐标点的键值对数组的值替换功能

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 代码: # 定义数据列表 data [{x: 9000.00, y: 0.00, z: 28209.83},{x: 8950.70, y: 940.76, z: 28209.83},{x: 8803.33, y: 1871.21, z: 28209.83},{x: 8559.51, y: 2781.15, z: 28209.83},{x: 8221.91, y: …

Vue源码系列讲解——内置组件篇【一】(keep-alive)

目录 1. 前言 2 用法回顾 3. 实现原理 props created destroyed mounted render 4. 生命周期钩子 5. 总结 1. 前言 <keep-alive> 是 Vue 实现的一个内置组件&#xff0c;也就是说 Vue 源码不仅实现了一套组件化的机制&#xff0c;也实现了一些内置组件&#xf…

数据集生成 YOLOV5 可训练的数据目录、并且可视化

1、前言 YOLOV5 训练数据的目录结构如下&#xff1a; 如果有测试集的话&#xff0c;也按照下面目录摆放即可 注意&#xff1a;这里的图片和标签文件名要严格对应&#xff01;&#xff01;后缀除外 关于YOLOv5介绍或者yolo格式的介绍参考之前专栏&#xff0c; 2、划分数据生成…

SpringMVC04、Controller 及 RestFul

4、Controller 及 RestFul 4.1、控制器Controller 控制器复杂提供访问应用程序的行为&#xff0c;通常通过接口定义或注解定义两种方法实现。控制器负责解析用户的请求并将其转换为一个模型。在Spring MVC中一个控制器类可以包含多个方法在Spring MVC中&#xff0c;对于Contr…

http协议中的强缓存与协商缓存,带图详解

此篇抽自本人之前的文章&#xff1a;http面试题整理 。 别急着跳转&#xff0c;先把缓存知识学会了~ http中的缓存分为两种&#xff1a;强缓存、协商缓存。 强缓存 响应头中的 status 是 200&#xff0c;相关字段有expires&#xff08;http1.0&#xff09;,cache-control&…

C++ :内存管理 newdelete

目录 内存区域划分 C的动态内存的管理方式 new new的基本使用方法 【注意事项】 delete 【注意】 new和delete操作自定义类型 operator new 和 operator delete 【关于自定义类型new申请内存】 【原理】 【调用顺序】 【连续开辟空间问题】 malloc/free和…

基于UC3842的开关电源设计

基于UC3842的开关电源设计 摘要 在现代经济和科技的飞速发展的时代&#xff0c;电源的运用已经变得非常常见。目前&#xff0c;各种科技手段正在推动着电力电子技术和电源设备研发技术的快速发展&#xff0c;同时也促使电源设备向着高频化集成化方向发展。电源供电设备的开发和…

动态规划课堂5-----子序列问题(动态规划 + 哈希表)

目录 引言&#xff1a; 例题1&#xff1a;最长递增子序列 例题2&#xff1a;最长定差子序列 例题3&#xff1a;最长的斐波那契子序列的长度 例题4&#xff1a;最长等差数列 例题5&#xff1a;等差数列划分II-子序列 结语&#xff1a; 引言&#xff1a; 要想解决子序列问…

亚信安慧AntDB的超融合之路

在面对较大用户规模的系统建设需求时&#xff0c;传统数据库往往面临诸多挑战。为了满足多样化的技术要求&#xff0c;项目通常需要倚赖多套技术体系&#xff0c;例如&#xff0c;一套关系型数据库用于元数据管理和标签化管理&#xff0c;另一套则专注于非结构化文件的处理。这…

OWASP Top 10 网络安全10大漏洞——A03:2021-注入

10大Web应用程序安全风险 2021年top10中有三个新类别、四个类别的命名和范围变化&#xff0c;以及一些合并。 A03:2021-注入 Injection从第一的位置滑落至第三位置。94% 的应用程序针对某种形式的注入进行了测试&#xff0c;最大发生率为 19%&#xff0c;平均发生率为 3%&a…