LeetCode: Maximal Rectangle

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 };
时间: 2024-10-17 11:45:27

LeetCode: Maximal Rectangle的相关文章

LeetCode: Maximal Rectangle [085]

[题目] Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area. [题意] 给定一个由0和1填充的二维矩阵,找一个全是1的最大矩形 [思路] 扫描二维矩阵,凡是扫到值为1的块时候,以当前块为矩形的左上角区块拓展,找最大矩阵. 先找出以每个"1"区块为左上角区块的最大矩形,然后求出最大全局的最大矩形. 以下图为

[LeetCode] Maximal Rectangle(good)

Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area. 参考“Largest Rectangle in Histogram”这个题的解法,思想差不多一样,只是用h向量表示Rectangle中此元素中第一行到本行的高度,非常妙的算法: class Solution { public: int maximalRectang

LeetCode: Maximal Rectangle 解题报告

Maximal RectangleGiven a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area. Show TagsHave you met this question in a real interview? Yes  NoDiscussSOLUTION 1: 1 public class Solution { 2 publ

Leetcode:Maximal Rectangle 最大全1子矩阵

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. 解题分析: 联想到 最大矩形面积 这一题,可以在O(n)时间内求出 最大的矩形面积 如果我们把每一行看成x坐标,那高度就是从那一行开始往上数的1的个数. 利用 最大矩形面积 的方法,在O(n2)时间内就可以求出每一行形成的“柱状

[leetcode]Maximal Rectangle @ Python [图解] [很难]

原题地址:https://oj.leetcode.com/problems/largest-rectangle-in-histogram/ 题意: Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram. Above is a histogra

(每日算法)Leetcode --- Maximal Rectangle(最大子矩阵)

求在0-1矩阵中找出面积最大的全1矩阵 Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area. 首先,想使用遍历两次的暴力方法解决是不靠谱的,先打消这个念头. 这道题的解法灵感来自于 Largest Rectangle in Histogram 这道题,假设我们把矩阵沿着某一行切下来,然后把切的行作为底面,将自底面往上

[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. 此题是之前那道的Largest Rectangle in Histogram 直方图中最大的矩形 的扩展,这道题的二维矩阵每一层向上都可以看做一个直方图,输入矩阵有多少行,就可以形成多少个直方图,对每个直方图都调用Largest Rectangle in Hist

【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. 题解,很巧妙的一道题,对于一个0-1矩阵,它的每一行及以上都可以看作一个直方图(如下图所示),利用Largest Rectangle in Histogram的方法,可以在O(n)的时间搜索出这一行及以上的直方图中面积最大的矩形,对矩阵的每一行依次做这个操作,就可

Maximal Rectangle leetcode java

题目: Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area. 题解: 这道题可以应用之前解过的Largetst Rectangle in Histogram一题辅助解决.解决方法是: 按照每一行计算列中有1的个数,作为高度,当遇见0时,这一列高度就为0.然后对每一行计算 Largetst Rectangle in H