Maximal Rectangle [leetcode] 的三种思路
第一种方法是利用DP。时间复杂度是 O(m * m * n)
dp(i,j):矩阵中同一行以(i,j)结尾的所有为1的最长子串长度
代码例如以下:
    int maximalRectangle(vector<vector<char> > &matrix) {
        int m = matrix.size();
        if (m == 0) return 0;
        int n = matrix[0].size();
        if (n == 0) return 0;
        vector<vector<int>> dp(m, vector<int>(n));
        int maxArea = 0;
        for (int i = 0; i < m; i++)
        {
            for (int j = 0; j < n; j++)
            {
                if (matrix[i][j] == '0') continue;
                dp[i][j] = (j == 0 ? 1 : dp[i][j - 1] + 1);
                int minX = dp[i][j];
                for (int k = 1; k <= i + 1; k++)
                {
                    minX = min(minX, dp[i - k + 1][j]);
                    maxArea = max(maxArea, minX * k);
                }
            }
        }
        return maxArea;
    }
另外一种方法:
来自https://oj.leetcode.com/discuss/5198/a-o-n-2-solution-based-on-largest-rectangle-in-histogram
事实上这里和 Largest Rectangle in Histogram是类似的,
之前的dp(i,j)保存以第i行。第j列结尾的,同一行中连续1的个数;那么这里我们用一个数组x,使x[j]保存当前行第j列中的连续1的个数。之后按行遍历,每一行都按Largest Rectangle in Histogram的算法处理一遍
代码例如以下:复杂度为O(m*n)
    int maximalRectangle(vector<vector<char> > &matrix) {
        int m = matrix.size();
        if (m == 0) return 0;
        int n = matrix[0].size();
        if (n == 0) return 0;
        vector<int> height(n);
        int maxArea = 0;
        for (int i = 0; i < m; i++)
        {
            vector<int> index;
            for (int j = 0; j < n; j++)
            {
                if (matrix[i][j] == '0') height[j] = 0;
                else height[j] ++;
                while (index.size() && height[j] <= height[index.back()])
                    maxArea = max(getArea(height, index, j), maxArea);
                index.push_back(j);
            }
            while (index.size())
                maxArea = max(getArea(height, index, height.size()), maxArea);
        }
        return maxArea;
    }
    int getArea(vector<int> &height, vector<int>& index, int start)
    {
        int areaH = height[index.back()];
        index.pop_back();
        int end = index.empty() ? -1 : index.back();
        return (start - end - 1) * areaH;
    }
第三种方法:
利用极值http://hi.baidu.com/mzry1992/item/030f9740e0475ef7dc0f6cba
H[i][j] = 0 matrix[i][j] = '0'
H[i-1][j] + 1 matrix[i][j] = '1'
L[i][j] = max{L[i-1][j], 第i行左边第一个'0'的位置+1}
R[i][j] = min{R[i-1][j], 第i行右边第一个'0'的位置-1}
maxArea = max{maxArea, H[i][j] * (R[i][j] - L[i][j] + 1)}
因为H,L,R均仅仅用到i-1,j的内容,能够将空间进一步压缩成为O(N)的
代码例如以下:
    int maximalRectangle(vector<vector<char> > &matrix) {
        int m = matrix.size();
        if (m == 0) return 0;
        int n = matrix[0].size();
        if (n == 0) return 0;
        vector<int> h(n);
        vector<int> l(n);
        vector<int> r(n, n - 1);
        int maxArea = 0, maxL = 0, minR = m - 1;
        for (int i = 0; i < m; i++)
        {
            maxL = 0, minR = n-1;
            for (int j = 0; j < n; j++)
            {
                if (matrix[i][j] == '0')
                {
                    h[j] = 0;
                    l[j] = 0;
                    r[j] = n - 1;
                    maxL = j + 1;
                }
                else
                {
                    h[j]++;
                    l[j] = max(l[j], maxL);
                }
            }
            for (int j = n - 1; j >= 0; j--)
            {
                if (matrix[i][j] == '0')
                {
                    r[j] = n - 1;
                    minR = j - 1;
                }
                else
                {
                    r[j] = min(r[j], minR);
                    maxArea = max(maxArea, h[j] * (r[j] - l[j] + 1));
                }
            }
        }
        return maxArea;
    }
Maximal Rectangle [leetcode] 的三种思路的更多相关文章
- 简谈百度坐标反转至WGS84的三种思路
		
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 基于百度地图进行数据展示是目前项目中常见场景,但是因为百度地图 ...
 - Reorder List [leetcode] 这两种思路
		
第一个想法随着vector保存全部Node* 表拼接出来 void reorderList(ListNode *head) { vector<ListNode*> content; Lis ...
 - Java中实现十进制数转换为二进制的三种思路
		
Java中实现十进制数转换为二进制 第一种:除基倒取余法 这是最符合我们平时的数学逻辑思维的,即输入一个十进制数n,每次用n除以2,把余数记下来,再用商去除以2...依次循环,直到商为0结束,把余数倒 ...
 - Jump Game 的三种思路 - leetcode 55. Jump Game
		
Jump Game 是一道有意思的题目.题意很简单,给你一个数组,数组的每个元素表示你能前进的最大步数,最开始时你在第一个元素所在的位置,之后你可以前进,问能不能到达最后一个元素位置. 比如: A = ...
 - JavaWeb分页显示内容之分页查询的三种思路(数据库分页查询)
		
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6134851.html 在开发过程中,经常做的一件事,也是最基本的事,就是从数据库中查询数据,然后在客户端显示出 ...
 - Maximal Rectangle [LeetCode]
		
Problem Description: Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle co ...
 - Maximal Rectangle leetcode java
		
题目: Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones ...
 - 三种思路实现自定义404页面:Tomcat、SpringMVC精准匹配、重写DispatchServlet
		
第1种方式:Tomcat直接处理 web.xml <error-page> <error-code>404</error-code> <location> ...
 - c语言求回文数的三种算法的描述
		
c语言求回文数的三种算法的描述 题目描述 注意:(这些回文数都没有前导0) 1位的回文数有0,1,2,3,4,5,6,7,8,9 共10个: 2位的回文数有11,22,33,44,55,66,77,8 ...
 
随机推荐
- CRMEB系统就是集客户关系管理+营销电商系统,能够真正帮助企业基于微信公众号、小程序实现会员管理、数据分析,精准营销的电子商务管理系统。可满足企业新零售、批发、分销、等各种业务需求。
			
**可以快速二次开发的开源小程序商城系统源码**源码开源地址:https://github.crmeb.net/u/LXT 项目介绍: CRMEB系统就是集客户关系管理+营销电商系统,能够真正帮助企业 ...
 - Jquery中绑定事件的异同
			
谈论jquery中bind(),live(),delegate(),on()绑定事件方式 1. Bind() $(selector).bind(event,data,function) Event:必 ...
 - JQuery 一些特殊符号的使用
			
前言:我写博客的频率与我的清闲程度成正比.. 太闲了所以想记录一下JQuery里的特殊符号,级别:入门级.用到哪里写到哪里,不全面是肯定的. 其实只要接触前端就肯定少不了用jquery,但是以前太 ...
 - Android开放百度地图集成
			
1.创建应用 获取AK (我理解为Application key) 通过百度账号登录百度地图开放平台,进入API控制台 http://lbsyun.baidu.com/apiconsole/key ...
 - android学习-第二讲(修改项目名称和图标,log,过滤器)
			
一.在app/src/main/res下有 AndroidManifest.xml打开,打开后如下图1 二.日志工具log log.v() log.d() log.i() log.w() lo ...
 - jQueryAjax模拟按键消抖(可设置抖动延迟时间)
			
在硬件中,按键等都会有抖动现象,如何消除抖动,不重复触发事件呢,这就要用到消抖机制了. 这是我用jQuery模拟硬件消抖原理,额,可能是吧...又不对的地方,希望有高手指点指点. <!DOCTY ...
 - 很实用的html meta标签实现页面跳转
			
就算你是有很多年开发经验的web开发工程师,有着很多web开发经验,对于先进的web开发技术有着很深刻的研究,然而你却忽略了那些最最基础的东西!现在我来问你,你是否对html所有的标签都能熟练的使用呢 ...
 - 微信小程序,时间戳和日期格式互相转化
			
微信小程序,时间戳转为日期格式 通常后台传递过来的都是时间戳,但是前台展示不能展示时间戳.就需要转化了. 功能说明: 微信小程序里,时间戳转化为日期格式,支持自定义. 拷贝至项目utils/utils ...
 - phpStudy 升级 MySQL版本
			
1:停止phpStudy ,Mysql 服务;删除Mysql 文件夹 替换为新版本的Mysql 2:复制一份 my-default.ini,改名 my.ini ,打开,在最后面加上: basedir= ...
 - Python【每日一问】35
			
问: 基础题: 从键盘输入4个数字,各数字采用空格分隔,对应为变量x0,y0,x1,y1.计算(x0,y0)和(x1,y1)两点之间的距离,输出结果保留1位小数. 比如,键盘输入:0 1 3 5,屏幕 ...