LeetCode如何求连续子数组的最大和
发表于:2025-02-06 作者:千家信息网编辑
千家信息网最后更新 2025年02月06日,这篇文章主要介绍LeetCode如何求连续子数组的最大和,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!题目描述输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数
千家信息网最后更新 2025年02月06日LeetCode如何求连续子数组的最大和
这篇文章主要介绍LeetCode如何求连续子数组的最大和,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
题目描述
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为 O(n)。
1 <= arr.length <= 10^5 -100 <= arr[i] <= 100
题目样例
示例
输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
题目思考
如何记录最大和? 可以不使用额外空间吗?
解决方案
思路
题目要求复杂度 O(N), 那么我们就不能使用暴力两重循环求当前前缀和的方法了, 那样的复杂度是 O(N^2) 那如何做到一次遍历就计算出结果呢? 假设当前以 i 结尾的最大和是 sm, 那么到 i+1 的时候, 以它结尾的最大和可以有两种选择: 在 sm 的基础上加上 i+1 的值 也可以另起炉灶, 从 i+1 开始计算 (对应的是 sm < 0
的情况)也即 i+1 结尾的最大和就是 max(sm+arr[i+1], arr[i+1])
它就是新的 sm 值, 这样就不需要额外的空间 而最终的结果自然就是 max(以各个下标结尾的最大和)
, 可以在遍历的时候顺带一起判断以上就是典型的动态规划的思想, 利用前面的计算结果来推导出当前的结果 下面的代码对必要步骤有详细的解释, 方便大家理解
复杂度
时间复杂度 O(N)
只需要遍历整个数组一遍 空间复杂度 O(1)
不需要额外空间
代码
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
# 初始化最终结果为负无穷, 因为可能数组全部都是负数
res = -float('inf')
# 初始化和为0
sm = 0
for x in nums:
# 计算当前结尾的最大值
sm = max(sm + x, x)
# 更新最终结果为当前最大的最大值
res = max(res, sm)
return res
以上是"LeetCode如何求连续子数组的最大和"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
最大
数组
复杂
复杂度
结果
就是
空间
题目
最大值
代码
内容
时候
时间
篇文章
负数
解释
输入
必要
另起炉灶
下标
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
计算机三级网络技术证书丢了
透视互联网科技有限公司
全球八台时间服务器
必背单词软件开发
中国大型服务器公司
模式生物基因组数据库
四川毫末网络技术
新三板 数据库
安阳市网络安全案例
2018软件开发师答案
怎么样运行cmd数据库
软件开发合同验收期限
创建数据库能用汉字吗
恶意攻击网站服务器犯法吗
软件开发迭代表
深发展贵金属分析软件开发
数据库集群 开源
服务器如何安装数据库吗
经济频道网络安全
card数据库解析
万维考试服务器什么样子
广州好商汇网络技术有限
用友如何删除数据库中存在账套号
civi续航小白测评数据库
新三板 数据库
三级网络技术优秀合格
国家网络安全中心公开招聘
武隆软件开发培训
气象系统网络安全建设方案
黑客联盟网络安全系统