You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode 53 最大子数组和Golang简洁解法解析:res置0逻辑解惑

LeetCode 53 最大子数组和Golang解法解析

先贴出你提到的代码:

func maxSubArray(nums []int) int {
    if len(nums) == 1 {
        return nums[0]
    }
    maxSum, res, p := nums[0], 0, 0
    for p < len(nums) {
        res += nums[p]
        if res > maxSum {
            maxSum = res
        }
        if res < 0 {
            res = 0
        }
        p++
    }
    return maxSum
}

整体运行原理

这是Kadane算法的简化变种,核心逻辑是动态维护当前子数组的累加和,同时全程记录遍历过程中出现过的最大和。

逐部分拆解

  1. 边界处理:数组只有一个元素时直接返回该元素,逻辑直观。
  2. 变量初始化:
    • maxSum初始化为nums[0]:考虑到数组可能全是负数,不能初始为0,否则会漏掉唯一的负数元素。
    • res是当前正在累加的子数组和,初始为0,表示还未开始累加任何元素。
    • p是遍历数组的指针,从起始位置开始。
  3. 循环逻辑:
    • 每次将当前元素加入res,相当于尝试把当前元素纳入到当前的子数组中。
    • 立刻对比res和maxSum,如果res更大就更新maxSum,确保它始终是到目前为止找到的最大子数组和。
    • 关键步骤:if res < 0 { res = 0 }
      这一步是「及时止损」:如果当前累加的子数组和为负数,说明这个子数组对后续元素没有任何正向贡献——把它和后面的元素相加,只会拉低后续子数组的和,不如直接放弃这个子数组,从下一个元素重新开始计算新的子数组和。
      举个例子:当前res是-3,下一个元素是5。不重置的话新res是2,重置为0再加5得到5,显然5更接近我们要找的最大和。
      哪怕数组全是负数(比如[-2,-1,-3]),这个逻辑也能正常工作:初始maxSum是-2,第一次循环res变为-2,不大于maxSum,重置为0;第二次循环res加-1变为-1,此时maxSum更新为-1,再重置为0;第三次循环res加-3变为-3,小于maxSum,重置为0。最终返回的maxSum是-1,正好是数组中最大的元素,符合要求。

内容的提问来源于stack exchange,提问作者xpt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 00:13:22