温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-12-15 13:55:48 来源:亿速云 阅读:166 作者:小新 栏目:大数据

这篇文章主要介绍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如何求连续子数组的最大和”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI