首页 > 代码库 > LeetCode: Maximal Rectangle
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 };
LeetCode: Maximal Rectangle
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。