leetcode Maximal Rectangle

来源:互联网 发布:c语言大小写转换循环 编辑:程序博客网 时间:2024/06/07 15:16

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 01 0 1 1 11 1 1 1 11 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;        }};


0 0
原创粉丝点击