不能直接套用最大子数组和思路,因矩形面积是二维问题而该算法仅适用于一维;高效解法是逐行构建直方图高度数组并用单调栈求最大矩形。

为什么不能直接套用最大子数组和的思路
因为矩形面积涉及两个维度,maxSubArray 只能处理一维连续和;强行枚举所有上下边界再跑一遍一维算法,时间复杂度会到 O(m²n),在 m=1000 时容易超时。真正高效的做法是把问题“压扁”成直方图高度序列,再复用单调栈求最大矩形——这才是标准解法的核心跳板。
如何把每行转换成直方图高度数组
对每一行,维护一个 heights 数组,其中 heights[j] 表示以当前行为底、第 j 列向上连续 1 的个数:
- 若
matrix[i][j] == '1',则heights[j] = heights[j] + 1 - 若
matrix[i][j] == '0',则heights[j] = 0
这个更新只需 O(n) 时间,且可以原地复用上一行的 heights 数组,空间不额外增加。
怎么用单调栈求直方图中最大矩形
对每个 heights 数组调用一次单调递增栈(存下标),遇到更小高度时弹出并计算以弹出元素为高的矩形面积:
- 栈空时左边界为
-1,否则为栈顶新元素(即上一个更小值位置) - 右边界就是当前下标
i - 宽度 =
i - stack.top() - 1(弹出后的新栈顶是左边界)
注意:必须在 heights 末尾补一个 0,确保所有非零高度都被弹出计算。
int largestRectangleArea(vector<int>& heights) {
heights.push_back(0);
stack<int> st;
int res = 0;
for (int i = 0; i <h3>边界与数据类型容易踩的坑</h3>
<p>常见错误不是逻辑错,而是细节失控:</p>
<ul>
<li>
<code>matrix</code> 输入可能是 <code>vector<string></string></code> 或 <code>vector<vector>></vector></code>,别硬写 <code>== 1</code>,要写 <code>== '1'</code>
</li>
<li>初始化 <code>heights</code> 必须全为 0,尤其多组测试时容易忘记重置</li>
<li>面积可能超过 <code>int</code> 范围(比如 2000×2000 全 1),返回值和中间变量建议用 <code>long long</code> 或确认题目约束</li>
<li>矩阵为空或某行为空时,要提前 <code>return 0</code>,否则 <code>heights[0]</code> 访问越界</li>
</ul>
<p>最常被忽略的是补零操作和栈空判断——少一个就漏掉最后一组有效计算,导致结果偏小但不易复现。</p></int></int>
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











