【LeetCode】53. 最大子数组和
解题思路
最大子序和问题要求找到一个连续子数组,使其元素和最大。核心思路是使用动态规划或贪心策略:
- 核心观察:以
nums[i]结尾的最大子序和,要么是nums[i]自身,要么是nums[i]加上以nums[i-1]结尾的最大子序和(若后者为正)。 - 贪心策略:遍历数组时维护当前子序和
curSum。若curSum变为负数,则重置为当前元素(负数会拖累后续和),否则累加元素。同时用maxSum记录全局最大值。
关键步骤
-
初始化:
curSum = nums[0]:以首元素为起点的子序和。maxSum = nums[0]:全局最大和(处理全负数数组)。
-
遍历数组(从第2个元素开始):
- 更新当前子序和:
- 若
curSum > 0,则累加当前元素:curSum += nums[i](正数增益后续和)。 - 若
curSum ≤ 0,则重置为nums[i](负数拖累,从新起点开始)。
- 若
- 更新全局最大和:
maxSum = max(maxSum, curSum)。
- 更新当前子序和:
-
返回结果:
maxSum即为答案。
代码实现
代码解析:
- 初始化:
curSum和maxSum均设为nums[0],确保全负数数组时能返回最大负数。 - 遍历更新:
curSum <= 0时,重置为nums[i](如[-3, -1]中,-3会拖累后续,从-1重新开始)。curSum > 0时,累加nums[i](如[4, -1, 2]中,4 + (-1) = 3 > 0,继续累加2得到5)。
- 全局更新:每一步比较
curSum和maxSum,确保不遗漏任何可能的子序和。
示例测试
复杂度分析
| 维度 | 结果 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 遍历数组一次,每个元素处理时间为 O(1) 。 |
| 空间复杂度 | O(1) | 仅使用常数额外空间(curSum, maxSum)。 |
关键点总结
-
贪心策略:
- 当前子序和为负时立即重置,避免拖累后续和(核心优化点)。
- 正数累加可扩大子序和,负数需独立判断。
-
边界处理:
- 初始化
maxSum = nums[0]:确保全负数数组时返回最大元素(如[-3, -1]返回-1)。 - 空数组直接返回
0(题目要求子数组至少含一个元素,但代码需健壮性)。
- 初始化
-
与动态规划等价:
- 本质是动态规划的空间优化版,状态转移方程:
curSum = max(nums[i], curSum + nums[i])。
- 本质是动态规划的空间优化版,状态转移方程:
-
适用场景:
- 高效处理大规模数据(
n ≤ 3×10⁴)。 - 分治法(O(nlogn))更复杂,此解法更优。
- 高效处理大规模数据(

浙公网安备 33010602011771号