码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode: Maximal Rectangle

时间:2014-09-03 22:36:37      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   strong   ar   for   

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 };

 

LeetCode: Maximal Rectangle

标签:style   blog   http   color   os   io   strong   ar   for   

原文地址:http://www.cnblogs.com/boostable/p/leetcode_maximal_rectangle.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!