LeetCode: Maximal Rectangle
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
地址:https://oj.leetcode.com/problems/maximal-rectangle/
算法:要解决这道题,得利用Largest Rectangle in Histogram这道题的解法。我们把矩阵的每一行都看成histogram's bar的底,比如第i行可以看成从最后一行到第i行之间的histogram,并且每一列的高度为在该列上从i行开始向下数连续为1的行数。这样以第i行为矩阵的上面一条边的最大矩阵的值即为这个histogram中最大的矩阵面积。也就是说对于没一个行,我们都可以计算出该行所代表的histogram,然后调用Largest Rectangle in Histogram里面的函数就可以找出以该行为上边的最大矩阵,然后从所有行中找到整个问题的最大矩阵。代码:
1 class Solution {
2 public:
3 int maximalRectangle(vector<vector<char> > &matrix) {
4 if(matrix.empty() || matrix[0].empty()) return 0;
5 int row_num = matrix.size();
6 int col_num = matrix[0].size();
7 vector<int> histogram1(col_num), histogram2(col_num);
8 for(int j = 0; j < col_num; ++j){
9 histogram1[j] = matrix[row_num-1][j] - '0';
10 }
11 int max_area = largestRectangleArea(histogram1);
12 vector<int> *p_now = &histogram2;
13 vector<int> *p_pre = &histogram1;
14 for(int i = row_num-2; i >= 0; --i){
15 for(int j = 0; j < col_num; ++j){
16 if(matrix[i][j] == '0'){
17 (*p_now)[j] = 0;
18 }else if(matrix[i+1][j] == matrix[i][j]){
19 (*p_now)[j] = (*p_pre)[j] + 1;
20 }else{
21 (*p_now)[j] = 1;
22 }
23 }
24 int area = largestRectangleArea(*p_now);
25 if(area > max_area)
26 max_area = area;
27 vector<int> *temp = p_now;
28 p_now = p_pre;
29 p_pre = temp;
30 }
31 return max_area;
32 }
33 int largestRectangleArea(vector<int> &height) {
34 int len = height.size();
35 if(len < 1) return 0;
36 stack<int> stk;
37 int i = 0;
38 int max_area = 0;
39 while(i < len){
40 if(stk.empty() || height[stk.top()] <= height[i]){
41 stk.push(i++);
42 }else{
43 int t = stk.top();
44 stk.pop();
45 int area = height[t] * (stk.empty() ? i : i - stk.top() - 1);
46 if(area > max_area){
47 max_area = area;
48 }
49 }
50 }
51 while(!stk.empty()){
52 int t = stk.top();
53 stk.pop();
54 int area = height[t] * (stk.empty() ? len : len - stk.top() - 1);
55 if(area > max_area){
56 max_area = area;
57 }
58 }
59 return max_area;
60 }
61 };
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合终身会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C# 锁机制全景与高效实践:从 Monitor 到 .NET 9 全新 Lock
· 一则复杂 SQL 改写后有感
· golang中写个字符串遍历谁不会?且看我如何提升 50 倍
· C# 代码如何影响 CPU 缓存速度?
· 智能桌面机器人:使用 .NET 为树莓派开发 Wifi 配网功能
· 提升Avalonia UI质感,跨平台图标库选型实践
· 告别图形界面:Windows系统OpenSSH服务部署
· C# 中委托和事件的深度剖析与应用场景
· 突发,CSDN 崩了!程序员们开始慌了?
· 一个基于 .NET 8 + Ant Design Blazor 开发的简洁现代后台管理框架