不能直接用两层循环暴力求解,因为时间复杂度O(n²)在n=10⁵时会超时,且易错判全负数等边界情况;正确解法是动态规划,用cur_sum和max_sum两个变量滚动更新,核心是cur_sum = max(nums[i], cur_sum + nums[i])。

为什么不能直接用两层循环暴力求解
暴力法时间复杂度是 O(n²),对长度 10⁵ 的数组会超时;而且容易忽略边界情况,比如全负数时返回 0 就错了——实际应返回最大那个负数。
真正可靠的解法是动态规划,核心就一句话:dp[i] 表示以第 i 个元素结尾的最大连续子数组和。状态转移只看前一个结果要不要“接上”:
- 如果
dp[i-1] > 0,就接:dp[i] = dp[i-1] + nums[i] - 否则从头来:
dp[i] = nums[i]
实际写的时候不需要开数组,用两个变量滚动更新就行。
怎么用 std::max 和单变量实现(推荐写法)
这是最简洁、不易出错的 C++ 实现,空间 O(1),时间 O(n):
立即学习“C++免费学习笔记(深入)”;
int maxSubArray(vector<int>& nums) {
int cur_sum = nums[0];
int max_sum = nums[0];
for (int i = 1; i < nums.size(); ++i) {
cur_sum = max(nums[i], cur_sum + nums[i]);
max_sum = max(max_sum, cur_sum);
}
return max_sum;
}
注意两点:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
cur_sum始终表示“以当前元素结尾”的最优解,不是全局最大值 - 初始化必须用
nums[0],不能设成 0,否则全负数时会错
遇到 INT_MIN 或大数溢出怎么办
如果数组里有极大正负数,int 可能溢出。但题目没说数据范围时,先按 int 写;若明确可能越界,改用 long long:
long long cur_sum = nums[0]; long long max_sum = nums[0];
别用 LLONG_MIN 初始化——那会导致第一次 max() 比较失效;仍该用首元素初始化。
另外,C++17 起支持 std::reduce 并行版本,但不适用于这个 DP 场景,强行套用反而逻辑错误。
调试时怎么快速验证边界 case
手写测试用例比跑 OJ 更快,重点关注这三类:
- 全负:
{-3, -2, -1}→ 期望-1 - 单元素:
{5}→ 期望5 - 含零:
{-2, 1, 0, -3, 4}→ 期望4(不是1+0+(-3)+4=2)
最容易漏的是“最大和子数组恰好从中间开始”,比如 {-1, 2, 3, -4, 5, 6},答案是 5+6=11,不是前面的 2+3=5。单步调试时盯住 cur_sum 在 -4 后是否重置为 5,就能发现问题。

















