题目难度: 简单

原题链接

今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

给定一个整数数组,找出总和最大的连续数列,并返回总和。

示例:

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

题目思考

  1. 如何记录最大和?

解决方案

思路

  • 假设当前以 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

大家可以在下面这些地方找到我~😊

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

算法精选 - 微信扫一扫关注我