【LeetCode】Maximal Rectangle

来源:互联网 发布:java中list.sort 编辑:程序博客网 时间:2024/06/18 14:03

题目描述:

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

求一个由'0'  '1'组成的二维矩阵里,全部由'1'组成的最大矩形面积。

解法1:

自己一开始的想法是这样的:

1、从左上开始向右下遍历

2、每当遍历到一个元素matrix[i][j],则计算matrix[0][0]到matrix[i][j]区域内合法的最大矩形面积。

进行第二步操作时,可以用下DP思想来降低时间复杂度,用dp[i][j]来储存i,j位置左边和上边连续的'1'的长度。

代码如下:

class Solution {public:int maximalRectangle(vector<vector<char> > &matrix) {if (matrix.empty() || matrix[0].empty())return 0;int area(0);vector<vector<pair<int, int>>> dp(matrix.size() + 1, vector<pair<int, int>>(matrix[0].size() + 1, make_pair(0, 0)));for (int i = 0; i < matrix.size();i++)for (int j = 0; j < matrix[i].size(); j++){if (matrix[i][j] == '0')continue;int x = dp[i + 1][j].first + 1;int y = dp[i][j + 1].second + 1;dp[i + 1][j + 1] = make_pair(x, y);int minh = y;for (int k = 0; k < x; k++){minh = std::min(minh, dp[i + 1][j - k + 1].second);area = std::max(area, (k + 1)*minh);}}return area;}};

解法二:

用前面Largest Rectangle in Histogram的解法来做。

从上往下逐行计算,遍历到第i行时,与第0行围成一个直方图,计算该区域最大的矩形面积,最后得出答案。

代码如下:

class Solution {public:int area;int maximalRectangle(vector<vector<char> > &matrix) {if (matrix.empty() || matrix[0].empty())return 0;area = 0;vector<int> h(matrix[0].size() + 1, 0);for (int i = 0; i < matrix.size(); i++){for (int j = 0; j < matrix[i].size(); j++){if (matrix[i][j] == '0')h[j] = 0;elseh[j]++;}getArea(h);}return area;}void getArea(vector<int> &h){stack<int> height;int i = 0;while (i < h.size()){if (height.empty() || h[i] >= h[height.top()])height.push(i++);else{int n = height.top();height.pop();if (height.empty())n = h[n] * i;elsen = h[n] * (i - height.top() - 1);area = std::max(n, area);}}}};

分别提交三次,解法一时间为:96,116,136;解法二为:68,80,68,第二种方法应该效率更高一点。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 mfc文件上传下载 Eclipse4.8中搭建Android开发环境 1178:C语言实验题――单词统计 现在小明决定实现一个类似malloc的内存分配系统,具体来说,他需要连续处理若干申请内存的请求,这个 给定某二叉树的前序序列和中序序列,输出该二叉树的后序序列。(输入的前序遍历和中序遍历的结果中都不含重 vibe twitter 幼呦 fasttunnel 一叫三吱 浩君恋母 C语言实现朴素贝叶斯 shadowsocks服务 CCF201509-2日期计算 song:平面上若干个点,求任意两点间的最长距离 求n阶乘(1<=n<=10000) 【问题描述】计算一个班级N个学生三门课的各门课平均分,三门课总分,并输出成绩最高者的信息【输入形式】 NOD32分享区 舞蹈生 busfan vagrant 宋霏妍 IPPA-060036 petalinuxsd卡启动 三寸萝莉公交车 MPAndroidChart教程:概述 xxx.h:16:22:fatalerror:xxx.h:Nosuchfileordirectory 得到 PycharmProfessional PycharmProfessional snagit默认输入输出设置 爱加密脱壳 classmy_dialect(csv.Dialect):lineterminator=\'\\n\ unity音乐可视化 Fatal:FailedtostarttheJavaScriptconsole:apimodules android以图搜图 实现打开Android系统相册、照相机并实现照相,录像功能 视频 魔法 魔法上网 视频解析