力扣hot100:最大子数组和的两种高效方法:前缀和与Kadane算法(53)

最大子数组和问题是算法中的一个经典问题,即在给定整数数组中寻找连续子数组使其和达到最大(子数组不能为空)。本文将详细解析两种时间复杂度为 O(n)、空间复杂度为 O(1) 的精妙解法,并附上完整 Java 实现。

问题示例

给定数组 [-2,1,-3,4,-1,2,1,-5,4],最大子数组和为 [4,-1,2,1],其和为 6

方法一:前缀和法(Prefix Sum)

核心思想

通过动态计算数组前缀和,并维护当前最小前缀和,用当前前缀和减去最小前缀和得到局部最大子数组和。

算法步骤
  1. 初始化 temp 为当前前缀和(初始值为0)
  2. 初始化 min 为最小前缀和(初始值为0)
  3. 遍历数组:
    • 更新当前前缀和 temp += num
    • 计算当前子数组和:temp - min
    • 更新全局最大值 result
    • 更新最小前缀和 min
java 复制代码
public int maxSubArrayT1(int[] nums) {
    int temp = 0;
    int min = 0;
    int result = Integer.MIN_VALUE;
    for (int num : nums) {
        temp += num;             // 更新当前前缀和
        result = Math.max(result, temp - min); // 更新全局最大值
        min = Math.min(temp, min);    // 更新最小前缀和
    }
    return result;
}
示例分析

[-2,1,-3] 为例:

步骤 num temp min temp-min result
初始 - 0 0 - MIN
1 -2 -2 -2 -2-0=-2 -2
2 1 -1 -2 -1-(-2)=1 1
3 -3 -4 -4 -4-(-2)=-2 1(保持)

方法二:Kadane算法(动态规划)

核心思想

通过动态维护当前连续子数组和,当和小于等于0时丢弃该子数组(因其无法增大后续和),同时全程更新最大值。

算法步骤
  1. 初始化 temp 为当前子数组和(初始值为0)
  2. 初始化 max 为全局最大值(初始值为 Integer.MIN_VALUE
  3. 遍历数组:
    • temp += nums[i](累加当前值)
    • 更新 max = Math.max(max, temp)
    • temp <= 0,重置 temp = 0(丢弃负贡献子数组)
java 复制代码
public int maxSubArrayT2(int[] nums) {
    int max = Integer.MIN_VALUE;
    int temp = 0;
    for (int num : nums) {
        temp += num;          // 累加当前值
        max = Math.max(max, temp);  // 更新全局最大值
        if (temp <= 0) temp = 0;    // 若和为负则重置
    }
    return max;
}
示例分析

[-2,1,-3] 为例:

步骤 num temp max 操作
初始 - 0 MIN -
1 -2 -2 -2 temp<=0 → 重置为0
2 1 0+1=1 max(-2,1)=1 -
3 -3 1-3=-2 max(1,-2)=1 temp<=0 → 重置为0

方法对比与总结

特性 前缀和法 Kadane算法
核心思想 前缀和与最小值差值 动态丢弃负和子数组
重置条件 无显式重置 temp<=0 时重置
适用场景 需处理前缀和问题时 标准最大子数组问题
优势 直观易扩展 代码更简洁

关键共同点

  • 时间复杂度 O(n)(只需一次遍历)
  • 空间复杂度 O(1)(仅用常数变量)
  • 均能正确处理全负数数组(如 [-3,-1,-2] 返回 -1

两种方法都是高效解法,在实际面试或解题中:

  • Kadane算法更简洁常用
  • 前缀和法在需复用前缀信息时更灵活(如解决子矩阵最大和等问题)

两种解法简洁优雅,体现了算法设计中"维护关键状态,避免重复计算"的核心思想。理解其内在逻辑后,你能轻松应对各类子数组相关问题!

相关推荐
GalaxyPokemon1 天前
PlayerFeedback 插件开发日志
java·服务器·前端
小蒋学算法1 天前
贪心算法:IPO
算法
得物技术1 天前
大模型如何革新搜索相关性?智能升级让搜索更“懂你”|得物技术
算法·搜索引擎·排序算法
mit6.8241 天前
hash滑窗|dp
算法
Shinom1ya_1 天前
算法 day 42
数据结构·算法·leetcode
苏三说技术1 天前
聊聊防御式编程
后端
earthzhang20211 天前
【2051】【例3.1】偶数
开发语言·数据结构·算法·青少年编程·图论
IT_陈寒1 天前
SpringBoot 3.2新特性实战:这5个隐藏功能让开发效率翻倍🚀
前端·人工智能·后端
IT_陈寒1 天前
Vue3性能优化实战:这5个技巧让我的应用加载速度提升70% 🚀
前端·人工智能·后端
天天摸鱼的java工程师1 天前
别再写那些重复代码了!8年Java老兵教你用 Hutool 提升开发效率
java·后端