给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

示例:

输入:
[
  ["1","0","1","0","0"],
  ["1","0","1","1","1"],
  ["1","1","1","1","1"],
  ["1","0","0","1","0"]
]
输出:6

思路:动态规划

用dp二维数组保存每个位置以它结尾的,1的长度,例如dp[0][2]位置,1的长度为1,dp[2][4]位置,1的长度为5

知道各个位置以他结尾的1的长度之后,开始考虑矩形的宽度

以本题的结果为例,dp[2][4]长度为5,现在以他结尾的矩形面积max暂定为5,之后向上搜索,dp[1][4]长度为3,但是我们的高度增加了,所以现在面积是2*3=6,增大了,更新max为6即可。

提交的代码:

class Solution {
    public int maximalRectangle(char[][] matrix) {
            int n = matrix.length;
        int m=0;
        if(n>0)                                //题中有测试案例输入为空,因此直接写int m = matrix[0].length;会报错
        {
             m = matrix[0].length;
        }
        if(m==0&&n==0)
        {
            return 0;
        }
        int i,j,max=-1,t=0,k;
        int[][] dp1 = new int[n][m];
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if(matrix[0][0]=='1')
                {
                    dp1[0][0]=1;
                }
                else if(matrix[0][0]=='0')
                {
                    dp1[0][0]=0;
                }
                if(i==0&&j>0)
                {
                    if(matrix[i][j]=='1')
                    {
                        dp1[i][j] = dp1[i][j-1]+1;
                    }
                    else
                    {
                        dp1[i][j] = 0;
                    }
                }
                else if(j==0&&i>0)
                {
                    if(matrix[i][j]=='1')
                    {
                        dp1[i][j]=1;
                    }
                }
                else if(i>0&&j>0)
                {
                    if(matrix[i][j]=='1')
                    {
                        dp1[i][j] = dp1[i][j-1]+1;
                    }
                    else
                    {
                        dp1[i][j] = 0;
                    }
                }
                t = dp1[i][j];
                for(k=i;k>=0;k--)
                {
                    t = java.lang.Math.min(dp1[k][j], t);   //比较目前j列已经遍历过的行中,找到最小长度进行计算
                    if(t*(i-k+1)>max)
                    {
                        max = t*(i-k+1);
                    }
                }
            }
        }
        return max;
    }
}

完整代码:

public class Solution85 {
    public static int maximalRectangle(char[][] matrix) {
        int n = matrix.length;
        int m=0;
        if(n>0)
        {
             m = matrix[0].length;
        }
        if(m==0&&n==0)
        {
            return 0;
        }
        int i,j,max=-1,t=0,k;
        int[][] dp1 = new int[n][m];
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                if(matrix[0][0]=='1')
                {
                    dp1[0][0]=1;
                }
                else if(matrix[0][0]=='0')
                {
                    dp1[0][0]=0;
                }
                if(i==0&&j>0)
                {
                    if(matrix[i][j]=='1')
                    {
                        dp1[i][j] = dp1[i][j-1]+1;
                    }
                    else
                    {
                        dp1[i][j] = 0;
                    }
                }
                else if(j==0&&i>0)
                {
                    if(matrix[i][j]=='1')
                    {
                        dp1[i][j]=1;
                    }
                }
                else if(i>0&&j>0)
                {
                    if(matrix[i][j]=='1')
                    {
                        dp1[i][j] = dp1[i][j-1]+1;
                    }
                    else
                    {
                        dp1[i][j] = 0;
                    }
                }
                t = dp1[i][j];
                for(k=i;k>=0;k--)
                {
                    t = java.lang.Math.min(dp1[k][j], t);
                    if(t*(i-k+1)>max)
                    {
                        max = t*(i-k+1);
                    }
                }
            }
        }
        return max;
    }
    public static void main(String[] args)
    {
        char[][] a = {{'1','0','1','0','0'},{'1','0','1','1','1'},{'1','1','1','1','1'},{'1','0','0','1','0'}};
        System.out.println(maximalRectangle(a));
    }
}

Leetcode--85. 最大矩形相关推荐

  1. java 最大矩形_Java实现 LeetCode 85 最大矩形

    85. 最大矩形 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [ ["1","0","1 ...

  2. LeetCode 85. 最大矩形(DP/单调递增栈,难)

    文章目录 1. 题目 2. 解题 2.1 DP 2.2 单调递增栈 1. 题目 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [[" ...

  3. 2021-06-17Leetcode84.柱状图中最大的矩形 Leetcode.85最大矩形

    以任意一个矩形为高,只要找出最大的宽即可,这个宽是由其两侧第一个比它小的数字组成 1.1我的解法--暴力解法 以每个矩形为中心向两边扩散,分别在两边找到比它小的第一个数字,分别求出这两块 面积,然后加 ...

  4. leetcode 85. 最大矩形(dp)

    给定一个仅包含 0 和 1 .大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例 1: 输入:matrix = [["1",&quo ...

  5. LeetCode 85.最大矩形

    给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [   ["1","0","1", ...

  6. 单调栈:leetcode 84. 柱状图中最大的矩形/85最大矩形

    84. 柱状图中最大的矩形 遍历数组,以每一个元素作为高,向左右两边拓展,遇到第一个比该元素小的位置停下 图片源自leetcode力扣 一.暴力解法(超时) 遍历数组,以每一个元素作为高,向左右两边拓 ...

  7. LeetCode:85. 最大矩形

    题目链接 85. 最大矩形 题目描述 给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积. 示例: 输入: [["1","0" ...

  8. 【DP】LeetCode 85. Maximal Rectangle

    LeetCode 85. Maximal Rectangle Solution1: 一语惊醒梦中人啊,参考链接:https://www.youtube.com/watch?v=2Yk3Avrzauk ...

  9. leetcode 85. Maximal Rectangle | 85. 最大矩形(单调栈)

    题目 https://leetcode.com/problems/maximal-rectangle/ 题解 本题与 leetcode 84. Largest Rectangle in Histogr ...

  10. 【LeetCode笔记】85. 最大矩形(Java、单调栈)

    文章目录 题目描述 思路 && 代码 二刷 题目描述 其实是84. 柱状图中最大的矩形的兄弟题目,理解成多个84题,对结果取max即可. 思路 && 代码 一行抽象出一 ...

最新文章

  1. 用Unity的视频广告创建2D动作游戏 Create Action 2D Game With Video Ads In Unity
  2. 阿里程序员连续两次绩效3.25!大老板威胁要开除他!还不给赔偿金!问大家该如何维权?...
  3. Forrtl: severe(157): Program Exception - access violation
  4. 深入理解Spring系列之三:BeanFactory解析
  5. 第五章 MongoDb索引优化 5.4
  6. 微信自动回复和自动抢红包实现原理(二):自动回复
  7. 开发 Sublime Text 3 插件简易教程
  8. 带权的活动选择_操作系统 复习要点+习题-2016
  9. SpringBoot整合themeleaf+bootstrap (五)
  10. VC 项目支撑文件解释
  11. 解决办法一:GetProcAddress函数返回值总为NULL
  12. android模拟器定位失败,Android-无法在模拟器上获取GPS位置
  13. python爬虫毕业论文大纲参考模板_毕业论文提纲参考模板
  14. 微信开通检测工具使用小诀窍
  15. c语言运算符表 壁纸,Fences 3.0.5 桌面图标管理工具正式版
  16. 关于瑞星杀毒软件无法完全卸载、自动重装的无奈,与相应的解决办法
  17. thinkphp5.1生成错误日志文件以及Evn的使用
  18. 完美解决idea Maven Cannot reconnect
  19. 软件架构设计---软件架构风格
  20. 使用Retrofit的过程中遇到 type xxx.xxx.xxxdoes not have type parameters

热门文章

  1. 剑指Offer - 面试题3. 数组中重复的数字(哈希)
  2. cms安装教程Linux,DoraCMS安装教程(linux)
  3. python rsa 公钥解密_python使用rsa库做公钥解密(网上别处找不到)
  4. hive 创建表_2min快速了解,Hive内部表和外部表
  5. java分治法求数列的最大子段和_Java十大经典排序算法动画解析和 代码实现
  6. python3.7.1使用_在不影响使用python3.7.1的功能的情况下,是否可以从python代码中删除所有的ufuture_uu语句?...
  7. 微信小程序在当前页面设置其他页面的数据
  8. python的序列类型及其特点_Fluent Python 笔记——序列类型及其丰富的操作
  9. 美团NLP中心算法实习生内推啦!
  10. 开源开放 | 中文相对复杂词汇识别数据集RCWI-Dataset(CCKS2021)