你提供的代码是 **LeetCode 第53题:最大子数组和(Maximum Subarray)** 的标准动态规划解法,使用了 **Kadane 算法**,是一种非常高效的一维动态规划算法。它可以在 **O(n)** 时间复杂度内找到连续子数组的最大和。
---
## ✅ 代码解析与完整 VS2022 可运行版本
以下是适合在 **Visual Studio 2022 (VS2022)** 中运行的完整代码版本,包含 `vector`、主函数和测试用例。
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int pre = 0, maxAns = nums[0];
for (const auto& x : nums) {
pre = max(pre + x, x); // 当前元素与当前元素+前面序列和的最大值
maxAns = max(maxAns, pre); // 更新全局最大值
}
return maxAns;
}
};
// 主函数测试
int main() {
Solution sol;
vector<int> nums;
// 测试用例 1
nums = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
cout << "输入数组: ";
for (int num : nums) cout << num << " ";
cout << "\n最大子数组和为: " << sol.maxSubArray(nums) << endl << endl;
// 测试用例 2
nums = {1};
cout << "输入数组: ";
for (int num : nums) cout << num << " ";
cout << "\n最大子数组和为: " << sol.maxSubArray(nums) << endl << endl;
// 测试用例 3
nums = {5, 4, -1, 7, 8};
cout << "输入数组: ";
for (int num : nums) cout << num << " ";
cout << "\n最大子数组和为: " << sol.maxSubArray(nums) << endl << endl;
// 测试用例 4
nums = {-1, -2, -3, -4};
cout << "输入数组: ";
for (int num : nums) cout << num << " ";
cout << "\n最大子数组和为: " << sol.maxSubArray(nums) << endl << endl;
return 0;
}
```
---
## ✅ 示例输出
```
输入数组: -2 1 -3 4 -1 2 1 -5 4
最大子数组和为: 6
输入数组: 1
最大子数组和为: 1
输入数组: 5 4 -1 7 8
最大子数组和为: 23
输入数组: -1 -2 -3 -4
最大子数组和为: -1
```
---
## ✅ 算法逻辑详解
### ✅ 问题背景
给定一个整数数组 `nums`,找到一个具有最大和的连续子数组(子数组至少包含一个元素),返回其最大和。
### ✅ 解法思路:Kadane 算法(贪心 + 动态规划)
#### 核心思想:
- 维护一个变量 `pre`,表示以当前元素结尾的最大子数组和。
- 对于每个元素 `x`:
- 如果 `pre + x` 比 `x` 大,说明可以继续扩展当前子数组;
- 否则,舍弃之前的子数组,从当前元素重新开始。
- 每次更新全局最大值 `maxAns`。
#### 示例说明:
```
nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
遍历过程:
pre = -2 → maxAns = -2
pre = max(-2 + 1, 1) = 1 → maxAns = 1
pre = max(1 + (-3), -3) = -2 → maxAns = 1
pre = max(-2 + 4, 4) = 4 → maxAns = 4
...
最终 maxAns = 6
```
---
## ✅ 时间与空间复杂度
| 类型 | 复杂度 | 说明 |
|------|--------|------|
| 时间复杂度 | O(n) | 只遍历一次数组 |
| 空间复杂度 | O(1) | 只使用常数级额外空间 |
---
## ✅ 常见问题排查(VS2022)
1. **编译错误**
- 确保包含 `<vector>` 和 `<algorithm>`
- 使用 `using namespace std;` 或加上 `std::` 前缀
2. **运行时错误**
- 注意空数组处理(虽然题目保证至少一个元素)
- 确保 `max()` 函数参数正确
3. **逻辑错误**
- 初始化 `maxAns` 为 `nums[0]` 是关键
- `pre` 的初始值应为 `0`
---
## ✅ 对比其他解法
| 解法 | 时间复杂度 | 空间复杂度 | 特点 |
|------|------------|------------|------|
| Kadane 算法(当前方法) | O(n) | O(1) | 最优解,推荐 |
| 暴力枚举所有子数组 | O(n²) | O(1) | 简单但低效 |
| 分治法(归并思想) | O(n log n) | O(log n) | 面试拓展思路 |
| 动态规划(dp 数组) | O(n) | O(n) | 易理解,但空间略高 |
---