leetcode Maximal Rectangle

Given a 2D binary matrix filled with 0’s and 1’s, find the largest rectangle containing only 1’s and return its area.

For example, given the following matrix:

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

Return 6.

此题应该与前一道题“Largest Rectangle in Histogram”连起来看,这也是leetcode上两道题挨着的原因

看这个矩阵,是不是就像前一道题求最大矩阵面积。

代码如下,一看即懂:

class Solution {
public:
    int maximalRectangle(vector<vector<char> >& matrix) {
        int row = matrix.size();
        int col = matrix[0].size();
        if(row == 0 || col == 0)
        	return 0;
        vector<vector<int> >area(row, vector<int>(col, 0));
        int i, j, max = 0, tmp;
        for(j=0; j<col; ++j)
        	if(matrix[0][j] == '1')
        		area[0][j] = 1;
        for(i=1; i<row; ++i)
        	for(j=0; j<col; ++j)
        		if(matrix[i][j] == '1')
        			area[i][j] = area[i-1][j] + 1;
        for(i=0; i<row; ++i)
        {
        	tmp = largestRectangleArea(area[i]);
        	if(tmp > max)
        		max = tmp;
        }
        return max;
    }
    int largestRectangleArea(vector<int> &height) {//<span style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 30px;">前一道题“</span><a target=_blank target="_blank" href="https://leetcode.com/problems/largest-rectangle-in-histogram/" style="font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; color: rgb(0, 136, 204); text-decoration: none; line-height: 20px;">Largest Rectangle in Histogram</a><span style="color: rgb(51, 51, 51); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 30px;">”的代码</span>
            if(height.empty())
            	return 0;
            height.push_back(0);
            stack<int> s;
            int len = height.size() ,tmp;
            int leftarea, rightarea, max = 0;
            for(int i=0; i<len; ++i)
            {
            	while(!s.empty() && height[s.top()] > height[i])
            	{
            		tmp = s.top();
            		s.pop();
            		if(s.empty())
            			leftarea = (tmp+1)*height[tmp];
            		else
            			leftarea = (tmp-s.top())*height[tmp];
            		rightarea = (i-tmp-1)*height[tmp];
            		if(leftarea + rightarea > max)
            			max = leftarea + rightarea;
            	}
            	s.push(i);
            }
            return max;
        }
};

点赞