千家信息网

LeetCode如何求连续子数组的最大和

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍LeetCode如何求连续子数组的最大和,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!题目描述输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数
千家信息网最后更新 2026年11月03日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。

题目思考

  1. 如何记录最大和?
  2. 可以不使用额外空间吗?

解决方案

思路

  • 题目要求复杂度 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安全错误 数据库的锁怎样保障安全 江苏根荣互联网科技 云信互联网科技有限公司 科技赋能下的互联网金融 科技创新与互联网经济 科技信息互联网 成都互联网科技公司 电子科技大学互联网 沃里互联网科技 上游互联网科技 互联网 科技馆 青岛中康互联网医疗科技有限公司 宁波青枫互联网科技有限公司 乌鲁木齐新华智原互联网科技学校 徐州市互联网科技有限公司 上海科技产业互联网平台 山东大美朱楼互联网科技有限公司 九思连强互联网电子科技有限公司 中国新注册互联网科技 优雇互联网科技有限公司 株洲百竞科技的互联网营销顾问 广东万易互联网科技有限公司惠州分公司 深圳九邦互联网科技有限公司 科技信息互联网 北京互联网络科技有限公司 互联网科技logo设计 互联网5g黑科技有哪些 玉溪新华互联网科技好不好 本届互联网大会上的黑科技 北京瑞云互联网科技有限公司 前海云享互联网科技
0