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算法的简化变种,核心逻辑是动态维护当前子数组的累加和,同时全程记录遍历过程中出现过的最大和。
逐部分拆解
- 边界处理:数组只有一个元素时直接返回该元素,逻辑直观。
- 变量初始化:
maxSum初始化为nums[0]:考虑到数组可能全是负数,不能初始为0,否则会漏掉唯一的负数元素。res是当前正在累加的子数组和,初始为0,表示还未开始累加任何元素。p是遍历数组的指针,从起始位置开始。
- 循环逻辑:
- 每次将当前元素加入
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
相关产品推荐
相关产品推荐

