最大子数组和问题的分析思路
问题描述
给定一个整数数组 nums,找出具有最大和的连续子数组(至少包含一个元素),返回其最大和。
分析思路
1. 问题可视化
1 | 示例数组: [-2, 1, -3, 4, -1, 2, 1, -5, 4] |
2. 思路分析
局部最优解:
1
2
3
4
5
6
7
8位置i的最大子数组和有两种可能:
┌────────────────┐
│ 1. 加入前面的和 │
└────────────────┘
或
┌────────────┐
│ 2. 从自己开始 │
└────────────┘状态转移:
1
2
3
4
5
6
7
8
9
10dp[i] = max(nums[i], dp[i-1] + nums[i])
示意图:
dp[i-1] < 0 → ┌─────┐
│重新开始│
└─────┘
dp[i-1] > 0 → ┌─────┐
│继续累加│
└─────┘
3. 解题思路图解
1 | 数组: [-2, 1, -3, 4, -1, 2, 1, -5, 4] |
4. 关键观察
连续性质:
1
2[a] → [a,b] → [a,b,c]
连续扩展决策点:
1
2
3
4
5
6
7当前位置i的决策:
┌─────────────┐
│ 加入前面的和 │ ← dp[i-1] > 0
└─────────────┘
┌─────────┐
│ 重新开始 │ ← dp[i-1] ≤ 0
└─────────┘
5. 优化思路
空间优化:
1
2
3
4只需要记录:
┌──────────┐ ┌──────────┐
│当前最大和│ 和 │全局最大和│
└──────────┘ └──────────┘时间优化:
1
2
3一次遍历 → O(n)
无需回溯
无需额外空间
总结
问题的核心是理解:在每个位置,我们要决定是加入之前的和,还是重新开始。
使用动态规划思想,但可以优化为O(1)空间复杂度。
关键是理解局部最优和全局最优的关系。