最大子数组和问题:从暴力到Kadane算法的优雅蜕变

最大子数组和问题:从暴力到Kadane算法的优雅蜕变

给定一个整数数组,找出和最大的连续子数组(至少包含一个元素),并返回这个最大和。这个问题在面试中出现的频率相当高,今天我们就来彻底搞懂它。

示例:

  • 输入:arr\[\] = 2, 3, -8, 7, -1, 2, 3 → 输出:11(子数组7, -1, 2, 3的和)
  • 输入:arr\[\] = -2, -4 → 输出:-2(子数组-2的和)
  • 输入:arr\[\] = 5, 4, 1, 7, 8 → 输出:25(整个数组的和)

目录


学习最大子数组和问题时,从暴力解法到Kadane算法的优化过程,光靠文字推导很容易卡壳。最近发现一个叫图码的宝藏网站,把60多种算法做成交互式动画可视化,比如Kadane算法的状态转移过程,每一步都动态展示,非常直观。更绝的是,它支持输入自定义数据跑动画,甚至上传C/C++/Java/Python代码自动解析,对准备408考研 和数据结构期末考试特别友好。建议直接去体验一下,边看动画边理解,效率高很多。

图码-数据结构与算法交互式可视化平台

访问网站:https://totuma.cn

暴力解法:遍历所有子数组

最直观的方法就是枚举所有可能的子数组,计算每个子数组的和,记录最大值。

思路: 外层循环确定子数组的起点,内层循环确定终点,累加并更新最大值。

python 复制代码
def maxSubarraySum(arr):
    res = arr[0]
    for i in range(len(arr)):
        currSum = 0
        for j in range(i, len(arr)):
            currSum += arr[j]
            res = max(res, currSum)
    return res

复杂度分析:

  • 时间复杂度:O(n²) ------ 两层嵌套循环
  • 空间复杂度:O(1) ------ 只用了常数空间

当数组规模较大时,O(n²)的算法显然不够高效。我们需要更优的解法。


Kadane算法:线性时间解决

Kadane算法的核心思想是动态规划:对于每个位置,我们计算以该位置结尾的最大子数组和,然后取全局最大值。

核心思路:

  • 维护两个变量:res(全局最大和)和maxEnding(以当前位置结尾的最大和)
  • 遍历数组时,对于每个元素,有两种选择:
    1. 将当前元素加入之前的子数组(扩展)
    2. 从当前元素开始新的子数组
  • 选择两者中较大的作为新的maxEnding
  • 更新全局最大值res

算法步骤图解:

以数组2, 3, -8, 7, -1, 2, 3为例:

  • 初始:res = 2, maxEnding = 2
  • i=1 (3): maxEnding = max(3, 2+3) = 5, res = max(2,5) = 5
  • i=2 (-8): maxEnding = max(-8, 5-8) = -3, res = max(5,-3) = 5
  • i=3 (7): maxEnding = max(7, -3+7) = 7, res = max(5,7) = 7
  • i=4 (-1): maxEnding = max(-1, 7-1) = 6, res = max(7,6) = 7
  • i=5 (2): maxEnding = max(2, 6+2) = 8, res = max(7,8) = 8
  • i=6 (3): maxEnding = max(3, 8+3) = 11, res = max(8,11) = 11

最终结果:11

python 复制代码
def maxSubarraySum(arr):
    res = arr[0]
    maxEnding = arr[0]
    
    for i in range(1, len(arr)):
        maxEnding = max(maxEnding + arr[i], arr[i])
        res = max(res, maxEnding)
    
    return res

复杂度分析:

  • 时间复杂度:O(n) ------ 只需遍历一次数组
  • 空间复杂度:O(1) ------ 只用了常数空间

总结

算法 时间复杂度 空间复杂度 适用场景
暴力法 O(n²) O(1) 小规模数据或教学演示
Kadane算法 O(n) O(1) 大规模数据,实际应用

Kadane算法是解决最大子数组和问题的标准解法,其思想还可以推广到其他类似问题,如最大乘积子数组等。掌握这个算法,面试中遇到类似问题就能游刃有余了!


相关文章推荐:

  • 打印最大和子数组
  • 最大乘积子数组
  • 重复拼接数组的最大子数组和
相关推荐
凤凰院凶涛QAQ2 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
H.莓飛2 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
w_zero_one4 小时前
算法--模拟
java·数据结构·算法
秋天的怀念_David4 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
秋天的怀念_David5 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
薛定e的猫咪5 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪6 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
小羊没烦恼!7 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
wanderist.7 小时前
202609CSP认证P3
算法
云淡风轻~窗明几净8 小时前
角谷猜想最接近严格证明的测试 Version1.1.1
人工智能·算法·机器学习·图论