当前位置: 首页 > news >正文

实用指南:单调栈的“降维打击”:从直方图到矩阵——再探「最大矩形」

哈喽,各位,我是前端小L。

在 上一篇文章中,我们刚刚经历了一场酣畅淋漓的“封神之战”,用单调栈 O(n) 的优雅姿态,完美消除了“柱状图中最大的矩形”(LC 84)。我们掌握了如何在一次遍历中,确定每个柱子能延伸的左右边界。

今天,我们的战场从“一维”的柱状图,升级到了“二维”的 0/1 矩阵。我们要在这片土地上,圈出那块完全由 1 构成的、面积最大的矩形。你可能会觉得,维度升高,难度必然剧增。但你将惊喜地发现,凭借我们手中已有的“单调栈”利器,配合一点巧妙的“视角转换”,这个问题将应声而解!

力扣 85. 最大矩形

https://leetcode.cn/problems/maximal-rectangle/

题目分析: 在一个由 01 组成的二维矩阵中,找到只包含 1 的最大矩形的面积。

与 LC 84 的联系:LC 84 处理的是高度数组构成的直方图。而这个矩阵,看起来和直方图相去甚远。如何建立联系?

“Aha!”时刻 —— 逐行构建“空中直方图”

关键在于,我们不要试图一次性解决整个二维难题。我们可以逐行扫描该矩阵,并将每一行,想象成构建直方图的“地基”

核心思想: 当我们处理到第 i 行时,我们可以计算出在这一行,以每个位置 j 为底座,向上能延伸的连续 1高度是多少。

举个例子:matrix = [["1","0","1","0","0"],["1","0","1","1","1"], <-- 假设我们处理到这一行 (i=1) ["1","1","1","1","1"],["1","0","0","1","0"]]

  • 第 0 行: 高度数组 heights = [1, 0, 1, 0, 0]

  • 第 1 行:

    • j=0: matrix[1][0]=='1', 上一行高度 1 -> 新高度 1+1=2

    • j=1: matrix[1][1]=='0', 高度中断 -> 新高度 0

    • j=2: matrix[1][2]=='1', 上一行高度 1 -> 新高度 1+1=2

    • j=3: matrix[1][3]=='1', 上一行高度 0 -> 新高度 0+1=1

    • j=4: matrix[1][4]=='1', 上一行高度 0 -> 新高度 0+1=1

    • 第 1 行对应的高度数组 heights = [2, 0, 2, 1, 1]

发现了吗? 对于每一行 i,我们都可以生成一个对应的 heights 数组。而在以第 i 行为底、只包含 1 的所有矩形中,面积最大的那个,就等价于在由 heights 数组构成的直方图中,找到的最大矩形面积!

结论:大家成功地将一个二维(m*n) 矩阵问题,分解成了 m一维(1*n)柱状图最大矩形问题

最终算法:逐行构建直方图 + 复用 LC 84 解法

现在,算法步骤清晰无比:

  1. 初始化 maxArea = 0

  2. 创建一个 heights 数组,长度为 n(矩阵的列数),初始全为0。

  3. 逐行遍历矩阵 (从 i = 0m-1): a. 更新 heights 数组:遍历当前行 i 的每一列 j。 * 如果 matrix[i][j] == '1',则 heights[j] += 1。 * 如果 matrix[i][j] == '0',则 heights[j] = 0 (高度中断)。 b. 调用 LC 84 解法:将当前 heights 数组传入我们上一篇已经写好的 largestRectangleInHistogram 函数,得到当前行的最大矩形面积 currentMax。 c. 更新全局最大值maxArea = max(maxArea, currentMax)

  4. 所有行遍历完毕后,maxArea 就是最终答案。

代码实现 (融合 LC 84 解法)

#include 
#include 
#include  // for max
using namespace std;
class Solution {
public:int maximalRectangle(vector>& matrix) {if (matrix.empty() || matrix[0].empty()) {return 0;}int m = matrix.size();int n = matrix[0].size();// heights[j] 表示在当前行i,第j列向上延伸的连续1的高度vector heights(n, 0);int maxArea = 0;for (int i = 0; i < m; ++i) {// 1. 更新 heights 数组for (int j = 0; j < n; ++j) {if (matrix[i][j] == '1') {heights[j] += 1;} else {heights[j] = 0;}}// 2. 对当前 heights 数组(直方图)调用 LC 84 的解法maxArea = max(maxArea, largestRectangleInHistogram(heights));}return maxArea;}
private:// LeetCode 84: 柱状图中最大的矩形 (单调栈解法 - O(n) 时间, O(n) 空间)int largestRectangleInHistogram(vector& heights) {stack s; // 存储索引的单调递增栈heights.push_back(0); // 哨兵int n = heights.size();int maxArea = 0;for (int i = 0; i < n; ++i) {while (!s.empty() && heights[i] < heights[s.top()]) {int h = heights[s.top()];s.pop();int w = s.empty() ? i : i - s.top() - 1;maxArea = max(maxArea, h * w);}s.push(i);}heights.pop_back(); // 恢复return maxArea;}
};

总结:降维打击的威力

“就是今天这道题,问题转化”思想的又一次伟大胜利。它雄辩地证明了:

通过许多高维度的问题,能够通过巧妙的视角转换和预处理,被分解为一系列大家已经掌握解法的低维度子问题。

我们没有尝试发明一个全新的二维单调栈(那会非常复杂),而是:

  1. 逐行处理,将注意力集中在一维。

  2. 构建高度数组 heights,将二维的 0/1 信息转化为一维的高度信息。

  3. 复用已知模型(LC 84),解除转化后的一维挑战。

这种**“降维打击”**的思路,是算法设计中极其宝贵的财富。它要求我们不仅要会解决单个困难,更要善于发现不同问题之间的联系,建立起自己的“模型库”,并在遇到新挑战时,尝试将其“归约”到已知的模型上。

咱们下期见。

http://www.jsqmd.com/news/53874/

相关文章:

  • 哪个牌子的防脱洗发水好,头发脱发用什么洗发水好?
  • 头皮毛囊炎专用洗发水推荐:控油去屑与止痒舒缓效果很好的洗发水
  • 2025年质量好的并联发热电缆/发热电缆最新TOP厂家排名
  • Window Docker 安装MySQL8.0全流程 保姆级
  • 托福出分密钥:2025国内热门托福辅导机构实测核心优势对比
  • 2025年热门的小学生冬令营/正规冬令营推荐TOP10
  • 2025年上海职场人士婚介所推荐TOP5,高性价比的婚介公司
  • 2025年靠谱的自动发卡机/NFC卡发卡机厂家最新实力排行
  • 2025年靠谱的钱币评级/钱币行业精选榜
  • 权威测评:温和不刺激洗面奶排名,好用的洗面奶排行榜前十名
  • 2025年比较好的单组份聚脲用户口碑最好的厂家榜
  • 2025年比较好的远程医疗行业排行榜
  • 2025年口碑好的粉末冶金齿轮/粉末冶金厂家实力及用户口碑排行榜
  • 2025年口碑好的机器人编程/机器人编程加盟本地权威榜
  • Python调用PubMed API实战:构建医学文献搜索系统【附完整代码】 - 指南
  • 祛斑厉害的三个牌子榜单揭晓,效果好的祛斑产品有哪些?
  • 2025年靠谱的ALD原子层沉积设备/ALD原子层沉积实力榜
  • 2025年口碑好的密封风机厂家最新权威推荐排行榜
  • 告别备考迷茫!2025雅思培训班推荐,从基础到高分全覆盖
  • 关系建模的底层逻辑——范式与反范式的收益成本对照,主键与外键的实践取舍
  • 记一次flink任务因sink表被锁住而引发的flink雪崩问题
  • 公认隔离防晒霜排行榜前十名品牌全解析,防晒霜什么牌子效果好?
  • 2025年专业的万级净化工程实力厂家TOP推荐榜
  • KINGMA Odometer Correction Tool: Easy Cluster Programming Mileage Adjustment for EU/US Cars
  • 实用指南:IOT项目——电源入门系列-第一章
  • 2025年口碑好的氮气电加热器/天然气电加热器高评价厂家推荐榜
  • 2025年有实力的外贸ERP品牌企业排名:口碑好的外贸ERP
  • 2025年评价高的木质艺术楼梯/艺术楼梯厂家实力及用户口碑排行榜
  • 短期高效提分!2025年国内雅思封闭班核心机构评测
  • 2025年热门的三相电力设备/铁塔电力设备厂家推荐及选购参考榜