[Leetcode 85] Maximal Rectangle

  • Question
    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,求柱状图中最大矩阵的面积。
      例如:
      左边是原始矩阵, 右边对应转换后的柱状图,(行与行对应,相应位置的数表示该位置的高度)
      
      1 0 1 0 0    ----->      1 0 1 0 0
      1 0 1 1 1    ----->      2 0 2 1 1
      1 1 1 1 1    ----->      3 0 3 2 2 
      1 0 0 1 0    ----->      4 0 0 3 0 

    代码如下:

class Solution {
public:
    int largestRectangleArea(const vector<int>& bar){
        int ret=0;
        int len=bar.size();
        stack<int> s;
        for(int i=0; i<len;++i){
            while(!s.empty() && bar[s.top()] > bar[i]){
                int h=bar[s.top()];
                s.pop();
                int left=s.empty()?-1:s.top();

                if(ret<(i-left-1)*h) ret=h*(i-left-1);
            }
            s.push(i);
        }
        return ret;
    }
    int maximalRectangle(vector<vector<char>>& matrix) {
        if(matrix.empty()) return 0;
        int maxA=0;
        int row=matrix.size(), col=matrix[0].size();
        vector<int> bar(col+1,0);
        for(int i=0; i<row; ++i){
            for(int j=0; j<col; ++j){
                if(matrix[i][j]=='1') ++bar[j];
                else bar[j]=0;
            }
            maxA=max(maxA,largestRectangleArea(bar));
        }
        return maxA;
    }
};
  • 动态规划解法(详见这里)。 点(i, j) 所在的矩阵的面积为height[i, j]*(right[i, j]-left[i, j])。其中height[i, j]统计当前位置及往上’1’的数量;left和right是高度是当前点的height值得左右边界。
    转化方程如下:
left(i,j) = max(left(i-1,j), cur_left),   

right(i,j) = min(right(i-1,j), cur_right)  

height(i,j) = height(i-1,j) + 1, if matrix[i][j]=='1';    

height(i,j) = 0, if matrix[i][j]=='0'

代码如下:

 int maximalRectangle(vector<vector<char>>& matrix) {
        if(matrix.empty()) return 0;
        int maxA=0;
        int row=matrix.size(), col=matrix[0].size();
        vector<int> left(col,0),height(col,0), right(col,col);

        for(int i=0; i<row; ++i){
            int curleft=0,curright=col;
            for(int j=0; j<col; ++j){
                if(matrix[i][j]=='1') height[j]=++height[j];
                else height[j]=0;

                if(matrix[i][j]=='1') left[j]=max(left[j],curleft);
                else{
                    left[j]=0;curleft=j+1;
                }
            }

            for(int j=col-1; j>=0; --j){
                if(matrix[i][j]=='1') right[j]=min(right[j],curright);
                else{
                    right[j]=col; curright=j;
                }
            }

            for(int j=0; j<col;++j)
                maxA=max(maxA,(right[j]-left[j])*height[j]);
        }
        return maxA;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园悬赏任务平台对字典管理、论坛管理、任务资讯任务资讯公告管理、接取用户管理、任务管理、任务咨询管理、任务收藏管理、任务评价管理、任务订单管理、发布用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行校园悬赏任务平台程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。校园悬赏任务平台的开发让用户查看任务信息变得容易,让管理员高效管理任务信息。 校园悬赏任务平台具有管理员角色,用户角色,这几个操作权限。 校园悬赏任务平台针对管理员设置的功能有:添加并管理各种类型信息,管理用户账户信息,管理任务信息,管理任务资讯公告信息等内容。 校园悬赏任务平台针对用户设置的功能有:查看并修改个人信息,查看任务信息,查看任务资讯公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看任务,删除任务操作,新增任务操作,修改任务操作。任务资讯公告信息管理页面提供的功能操作有:新增任务资讯公告,修改任务资讯公告,删除任务资讯公告操作。任务资讯公告类型管理页面显示所有任务资讯公告类型,在此页面既可以让管理员添加新的任务资讯公告信息类型,也能对已有的任务资讯公告类型信息执行编辑更新,失效的任务资讯公告类型信息也能让管理员快速删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值