C++ 最大全F矩形面积求解(单调栈优化)
好的,我们先来分析一下这个题目。这个问题的本质是 **在一个由 'F' 和 'R' 组成的网格中,找到只含 'F' 的最大矩形面积**。 这是一个经典的“最大全1矩形”问题,可以基于**直方图的最大矩形面积**算法来解决。 --- ## 🧩 解题思路 我们可以将每一行看作一个**直方图的底边**: - 对于每一列,维护一个高度 `height[j]`,表示从当前行向上连续 **'F'** 的个数。 - 如果当前位置是 `'R'`,则高度重置为 0;否则高度加 1。 - 然后问题转化为**每行的直方图中找最大矩形面积**。 求直方图最大矩形面积,我们可以使用**单调栈**方法,时间复杂度 O(M)。 整体复杂度:O(N × M),在 1000×1000 范围内完全可行。 ### 🔧 算法步骤 1. **读入** N, M 和字符矩阵。 2. **初始化**一个高度数组 `height` 长度为 M,全部为 0。 3. **遍历每一行**: - 更新 `height[j]`:若当前字符为 `'F'`,则 `height[j]++`,否则置 0。 - 调用函数计算当前 `height` 数组的最大矩形面积。 4. **更新全局最大面积**。 5. **输出结果**。 ### 📐 单调栈求直方图最大矩形面积算法 - 维护一个**递增栈**,存储柱子下标(高度递增)。 - 遍历每个柱子时: - 如果当前高度小于栈顶高度,则弹出栈顶,并以该高度为矩形高,宽度为 `当前下标 - 新的栈顶下标 - 1`(或如果栈为空则宽度为当前下标)。 - 重复直到当前高度大于等于栈顶高度或栈空,再压入当前下标。 - 遍历结束后,栈中可能还有柱子,按同样方式处理。 --- ## 💻 C++ 代码实现 ```cpp #include <bits/stdc++.h> using namespace std; // 计算直方图最大矩形面积 int largestRectangleArea(vector<int>& heights) { stack<int> st; int maxArea = 0; int n = heights.size(); for (int i = 0; i <= n; ++i) { int h = (i == n) ? 0 : heights[i]; while (!st.empty() && h < heights[st.top()]) { int height = heights[st.top()]; st.pop(); int width = st.empty() ? i : i - st.top() - 1; maxArea = max(maxArea, height * width); } st.push(i); } return maxArea; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, M; cin >> N >> M; vector<vector<char>> grid(N, vector<char>(M)); for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { cin >> grid[i][j]; } } vector<int> height(M, 0); int maxArea = 0; for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { if (grid[i][j] == 'F') { height[j]++; } else { height[j] = 0; } } maxArea = max(maxArea, largestRectangleArea(height)); } cout << maxArea << "\n"; return 0; } ``` --- ## 📌 关键点说明 | 步骤 | 说明 | |------|------| | **height 数组更新** | 每行扫描时,若为 `'F'` 则累加高度,否则重置为 0 | | **单调栈算法** | 用于 O(M) 计算单行最大矩形面积 | | **时间复杂度** | O(N × M),适合 1000×1000 数据规模 | | **空间复杂度** | O(M) 用于高度数组和栈 | --- ## ⚠️ 注意陷阱 - 输入字符之间**有空格**,需要用 `cin` 正常读入,无需特殊处理。 - 数据范围较大,建议使用 `ios::sync_with_stdio(false)` 加速输入。 - 单调栈处理结束后,要记得把栈中剩余元素也计算一遍。 --- ## 📘 推荐扩展 - **LeetCode 85. Maximal Rectangle**(本题的二维版本) - **LeetCode 84. Largest Rectangle in Histogram**(单调栈基础题) - 可尝试改为 **DP + 单调栈** 或 **悬线法** 实现(思路类似) --- ## 💡 开发建议 1. **先写单调栈的函数**,再处理二维矩阵,模块化更易调试。 2. 在本地测试时,可以用小矩阵手动验证结果。 3. 注意使用 `long long` 防止乘积溢出(本题面积在 int 范围内,但养成好习惯无妨)。 --- ######[AI写代码神器 | 1160点数解答 | 2026-06-14 19:41:55]
- Java 简单工厂模式:打造可扩展的几何图形绘图工具类(阿里通义 | 570点数解答 | 2024-11-30 14:40:37)179
- Java 运用简单工厂模式构建多几何形状绘图工具类全解析 (字节豆包 | 584点数解答 | 2024-11-30 14:41:44)169
- Python 破解:计算 n*n 网格中只含 1 的最大矩形数字和! (字节豆包 | 534点数解答 | 2026-02-07 20:24:57)44
- 解析React 15与Vue 2:从O(n^3)到O(n),Diff算法时间复杂度计算及性能对比 (阿里通义 | 379点数解答 | 2023-11-09 01:49:19)374
- 缜密逻辑,全新无名杀“风餐”技能代码精心打造与深度解析 (字节豆包 | 469点数解答 | 2025-04-05 11:37:06)303
- 精准优化:明确需求,开启高效提升之旅! (字节豆包 | 52点数解答 | 2026-02-09 16:44:46)96
- 代码再升级:优化版“获取dump”代码,多机制保障数据读取与保存(字节豆包 | 734点数解答 | 2026-02-10 01:23:31)103
- 代码深度优化:全面检查异常、灵活读取内存,提升可读性与可维护性(字节豆包 | 959点数解答 | 2026-02-10 01:24:14)77
- Python 代码:计算多个球体与圆柱体的表面积和体积之和(讯飞星火 | 614点数解答 | 2024-06-13 19:29:36)256
- 巧用Python读取乡镇数据:统计志远县图斑个数与罗丰县面积之和(讯飞星火 | 384点数解答 | 2024-06-30 00:34:35)198
- Python 实现读取 shp 图层数据:统计志远县图斑个数与罗丰县面积并保存结果及代码(讯飞星火 | 2048点数解答 | 2024-06-30 01:03:59)213
- Python 读取 shp 图层数据:统计志远县图斑个数与罗丰县面积之和(讯飞星火 | 251点数解答 | 2024-06-30 01:05:04)176