用dp计算矩形面积

文章目录

  • 1题目理解
  • 2分析
  • 2.1 暴力搜索
  • 2.2 动态规划
  • 3 相关题目

1题目理解

输入:char[][] matrix 是一个二维数组,值由0和1组成。
输出:一个矩形的面积,这个矩形只包含1。
例子:
Input:
[
[“1”,“0”,“1”,“0”,“0”],
[“1”,“0”,“1”,“1”,“1”],
[“1”,“1”,“1”,“1”,“1”],
[“1”,“0”,“0”,“1”,“0”]
]
Output: 6

2分析

最开始没理解,直接想之前做过,从一个点向4个方向延伸,找最大值。写完,发现图形不是矩形。
开始思考,因为是矩形该怎么做。思路参考力扣。

2.1 暴力搜索

枚举左上角(x1,y1)坐标和右下角(x2,y2)左边,计算面积。时间复杂度O(m3n3)O(m^3n^3)O(m3n3)。

2.2 动态规划

dp[i][j] = 在第i行,以j结尾的最长的包含1的子数组的长度。
dp[i][j]=0,matrix[i][j]=′0′dp[i][j] = 0,matrix[i][j]='0'dp[i][j]=0,matrix[i][j]=′0′
dp[i][j]=dp[i][j−1]+1,matrix[i][j]=′1′dp[i][j] = dp[i][j-1]+1,matrix[i][j]='1'dp[i][j]=dp[i][j−1]+1,matrix[i][j]=′1′

例如上面的例子 dp[1] = {1,0,1,2,3}
知道了每一行的宽度,从第i行开始,向上计算,找到最小的宽度,乘以高,就是矩形的面积。
这是一个动态规划dp的值只是返回值一部分的例子。

class Solution {private int maxSum;public int maximalRectangle(char[][] matrix) {if(matrix==null || matrix.length==0) return 0;int m = matrix.length;int n = matrix[0].length;int maxArea = 0;int[][]  dp = new int[m][n];for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(matrix[i][j]=='1'){dp[i][j] = (j==0?1:dp[i][j-1]+1);int minWidth = dp[i][j];for(int upRow = i;upRow>=0;upRow--){int height = i-upRow+1;minWidth = Math.min(minWidth,dp[upRow][j]);maxArea = Math.max(maxArea,minWidth*height);}}}}return maxArea;}}

3 相关题目

304 Range Sum Query 2D – Immutable 计算一个矩阵范围内的数字和

class NumMatrix {int[][] dp;public NumMatrix(int[][] matrix) {if(matrix == null || matrix.length == 0) return;int m  = matrix.length;int n = matrix[0].length;dp = new int[m][n];for(int i=0;i<m;i++){for(int j = 0;j < n;j++){dp[i][j] = (i>0?dp[i-1][j]:0) + (j>0?dp[i][j-1]:0) - (i>0 && j>0? dp[i-1][j-1]:0) + matrix[i][j];}}}public int sumRegion(int row1, int col1, int row2, int col2) {if(dp == null) return 0;return  dp[row2][col2] - (row1>0?dp[row1-1][col2]:0) - (col1 >0 ?dp[row2][col1-1]:0) + (row1>0 && col1>0 ?dp[row1-1][col1-1]:0);}
}

221 Maximal Square 计算正方形的最大面积

class Solution {public int maximalSquare(char[][] matrix) {if(matrix==null || matrix.length==0) return 0;int m = matrix.length;int n = matrix[0].length;int maxSide = 0;int[][]  dp = new int[m][n];for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(matrix[i][j]=='1'){if(i==0 || j==0){dp[i][j] = 1;}else{dp[i][j] = Math.min(dp[i-1][j],Math.min(dp[i-1][j-1],dp[i][j-1]))+1;}maxSide =  Math.max(maxSide,dp[i][j]);}}}return maxSide * maxSide;}
}

1277 Count Square Submatrices with All Ones 数一数正方形的个数

class Solution {public int countSquares(int[][] matrix) {int count = 0;int m = matrix.length;int n = matrix[0].length;int[][] dp = new int[m][n];for(int i = 0;i<m;i++){for(int j=0;j<n;j++){if(matrix[i][j] == 1){if(i==0 || j==0){dp[i][j] =1;}else{dp[i][j] = Math.min(Math.min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;}count += dp[i][j];}}}return count;}}

85. Maximal Rectangle相关推荐

  1. 【DP】LeetCode 85. Maximal Rectangle

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

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

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

  3. 【leetcode】85. Maximal Rectangle 0/1矩阵的最大全1子矩阵

    1. 题目 Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1 ...

  4. LeetCode 85. Maximal Rectangle --python,java解法

    题目地址: Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1 ...

  5. [leetcode]@python 85. Maximal Rectangle

    题目链接 https://leetcode.com/problems/maximal-rectangle/ 题目原文 Given a 2D binary matrix filled with 0's ...

  6. 85. Maximal Rectangle 由1拼出的最大矩形

    [抄题]: Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1 ...

  7. 85. Maximal Rectangle最大矩形

    艾恩凝 个人博客  https://aeneag.xyz/ 公众号 技术乱舞 每日一练,保持手感 2021/10/17 题目 https://leetcode-cn.com/problems/maxi ...

  8. [LeetCode]Maximal Rectangle

    Maximal Rectangle Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle conta ...

  9. LeetCode 笔记系列 18 Maximal Rectangle [学以致用](最大矩形)

    leetcode之Largest Rectangle in Histogram 标签: leetcode面试题最大矩形堆栈单调队列 2016-07-30 13:47 1325人阅读 评论(0) 收藏  ...

最新文章

  1. 12个深度学习面试问题
  2. 服务器系统都是64位的吗,云服务器32位跟64位的区别吗
  3. Python文本处理:解析json格式的数据
  4. Mac 每次都要执行source ~/.bash_profile 配置的环境变量才生效
  5. 更改hadoop native库文件后datanode故障
  6. 0x80070659系统策略禁止这个安装 vc_不安装DNS解析服务器下安装Vcenter6.7
  7. 有关C# 8.0、.NET Framework 4.8与NET Standard 2.1的一个说明
  8. vim多列操作--插入/删除
  9. ElasticSearch API文档查看
  10. NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询
  11. 一张图看懂华为2019年年报
  12. access中判断回文的代码_前端也来点算法(TypeScript版) | 2 - 回文数和回文链表
  13. 计算机二级office函数日期,Excel函数-日期和文本函数-计算机二级Office
  14. python基础4-序列
  15. MFC DLL向导(二)
  16. H5JS二维动画制作!two.js的基本操作class2
  17. 小型超市管理系统【软件工程大作业】
  18. MATLAB Smoothing Spline 拟合
  19. 一个炫酷的opengles2.0翻页效果(安卓上opengles2.0 翻书效果附源码)
  20. html+css 制作小米商城主体内容的商品展示

热门文章

  1. Javascript与C#中使用正则表达式
  2. ASP.Net页面刷新后自动滚动到原来位置
  3. UVA 11557 - Code Theft (KMP + HASH)
  4. Android项目使用Eclipse进行单元测试
  5. 毫秒级百万数据分页存储过程
  6. SharePoint 跨域还原网站一则
  7. 查看linux的用户
  8. ASP.NET小技巧——回传后保持页面的滚动位置
  9. mc服务器word文件夹,我的世界服务器创建:MC个人服务器创建流程
  10. dubbo源码解析(二)