【问题描述】[第221题][最大正方形][中等]

在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大/长方形正方形,并返回其面积。示例:输入: 1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
长方形 输出: 6
正方形 输出: 4

【解答思路】

1. 长方形 暴力

时间复杂度:O(N^2) 空间复杂度:O(N^2)

public int maximalRectangle(char[][] matrix) {if (matrix.length == 0) {return 0;}//保存以当前数字结尾的连续 1 的个数int[][] width = new int[matrix.length][matrix[0].length];int maxArea = 0;//遍历每一行for (int row = 0; row < matrix.length; row++) {for (int col = 0; col < matrix[0].length; col++) {//更新 widthif (matrix[row][col] == '1') {if (col == 0) {width[row][col] = 1;} else {width[row][col] = width[row][col - 1] + 1;}} else {width[row][col] = 0;}//记录所有行中最小的数int minWidth = width[row][col];//向上扩展行for (int up_row = row; up_row >= 0; up_row--) {int height = row - up_row + 1;//找最小的数作为矩阵的宽minWidth = Math.min(minWidth, width[up_row][col]);//更新面积maxArea = Math.max(maxArea, height * minWidth);}}}return maxArea;
}
2. 正方形 暴力
  • 正方形的面积是边长乘边长, maxArea 是没有意义的-- 只记录最大边长即可。然后是其它细节的修改,让代码更简洁,代码如下。
    时间复杂度:O(N^2) 空间复杂度:O(N^2)
public int maximalSquare(char[][] matrix) {if (matrix.length == 0) {return 0;}// 保存以当前数字结尾的连续 1 的个数int[][] width = new int[matrix.length][matrix[0].length];// 记录最大边长int maxSide = 0;// 遍历每一行for (int row = 0; row < matrix.length; row++) {for (int col = 0; col < matrix[0].length; col++) {// 更新 widthif (matrix[row][col] == '1') {if (col == 0) {width[row][col] = 1;} else {width[row][col] = width[row][col - 1] + 1;}} else {width[row][col] = 0;}// 当前点作为正方形的右下角进行扩展int curWidth = width[row][col];// 向上扩展行for (int up_row = row; up_row >= 0; up_row--) {int height = row - up_row + 1;if (width[up_row][col] <= maxSide || height > curWidth) {break;}maxSide = Math.max(height, maxSide);}}}return maxSide * maxSide;
}
2. 正方形 动态规划

第 1 步:设计状态
dp[i][j] 表示以 matrix[i][j] 为右下角正方形的最大边长
第 2 步:状态转移方程
dp[i][j] = Min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]) + 1

当前点的左边,上边,左上角的三个点中选一个最小值,然后加 1

第 3 步:考虑初始化
第一行和第一列的 dp[i][j] = matrix[i][j] - ‘0’,也就意味着 dp[i][j] 要么是 0 要么是 1
第 4 步:考虑输出
第 5 步:考虑是否可以状态压缩


时间复杂度:O(N^2) 空间复杂度:O(N)

public int maximalSquare(char[][] matrix) {int rows = matrix.length;if (rows == 0) {return 0;}int cols = matrix[0].length;int[][] dp = new int[rows + 1][cols + 1];int maxSide = 0;for (int i = 1; i <= rows; i++) {for (int j = 1; j <= cols; j++) {//因为多申请了一行一列,所以这里下标要减 1if (matrix[i - 1][j - 1] == '0') {dp[i][j] = 0;} else {dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;maxSide = Math.max(dp[i][j], maxSide);}}}return maxSide * maxSide;
}

【总结】

1.动态规划流程

第 1 步:设计状态
第 2 步:状态转移方程
第 3 步:考虑初始化
第 4 步:考虑输出
第 5 步:考虑是否可以状态压缩
- 二维数组 -> 一维数组

2. 行 row 列 col 注意边界!
  • 二维数组

int rows = matrix.length;
nt cols = matrix[0].length;

3. 暴力 ->优化

转载链接:https://leetcode-cn.com/problems/maximal-square/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by–46/
参考链接:https://leetcode-cn.com/problems/maximal-square/solution/li-jie-san-zhe-qu-zui-xiao-1-by-lzhlyle/

[Leedcode][JAVA][第85题][第221题][最大正方形][动态规划]相关推荐

  1. [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]

    [问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...

  2. [Leedcode][JAVA][第470题][Ran7()实现Rand10()]

    [问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...

  3. [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]

    [问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...

  4. [Leedcode][JAVA][第4题][寻找两个正序数组中的中位数][二分查找][双指针]

    [问题描述][困难] 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)).你可以假设 ...

  5. Java入门基础及面试100题--初入门

    Java入门基础及面试100题 注:适合应届毕业生或java初入门者 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程, ...

  6. Day5.牛客网剑指offer 67题之43-54题(java代码)

    文章目录 Day5.牛客网剑指offer 67题之43-54题 43.左旋转字符串 44.翻转单词顺序列 45.扑克牌顺序 46.孩子们的游戏 47.求1+2+...+n 48.不用加减乘除做加法 4 ...

  7. 2021年 第12届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2021.04.18】

    蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[题目下载.2013年(第4届)~2020年(第11届)] CSDN 蓝桥杯 专栏 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结 ...

  8. java计算机毕业设计软考刷题系统源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计软考刷题系统源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计软考刷题系统源码+mysql数据库+系统+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开 ...

  9. java程序设计模拟题_《Java程序设计》东师模拟题题目及答案

    <Java程序设计>东师模拟题题目及答案 2020-08-30 09:08:37 931 有学员问关于<Java程序设计>东师模拟题题目及答案的题目的参考答案和解析,具体如下: ...

最新文章

  1. Scala元组:存放各种相同或不同类型的数据
  2. k1075停运吗_怀化火车站(怀化火车停运最新消息)
  3. LightSwitch中的权限
  4. [html] H5播放的video视频,如何实现对视频截图?
  5. Linux系统编程 -- 信号及signal函数
  6. Seek and Destroy
  7. 计算机基础硬件知识试题及答案,计算机基础知识试题及答案大全(总结一)
  8. Android音视频开发(一)音视频基础知识
  9. 产品经理面试常见问题及答案参考总结(一)
  10. mysqldump --set-gtid-purged=OFF
  11. Solving environment: failed
  12. 以数据驱动的支付场景数字营销,能否成为下一个...
  13. 小程序团购商品CPS接入,实现达人分佣模式
  14. 解决共享文件夹不显示以及VMware-tools的重装问题
  15. CENTOS上的网络安全工具(九)走向Hadoop(1) SingleNode模式安装与配置
  16. [附源码]计算机毕业设计宁财二手物品交易网站Springboot程序
  17. 五次面试,程序员的悲催轮回
  18. 单链表的Java简单实现
  19. 【迪大学院】X64X86游戏安全逆向分析相关所有视频链接
  20. 某软件平台定制开发项目技术标书

热门文章

  1. java中sesion
  2. [禅悟人生]心平气和, 慢慢修行
  3. 写一个简单控制台启动的mcv服务
  4. 3389爆破DUBrute_2.1
  5. 基于visual Studio2013解决面试题之0203栈实现
  6. can't load apple.laf.AquaLookAndFeel (Ant in Eclipse can't find it
  7. java做报表_一步一步使用POI做java报表
  8. integer对应java类型_Java中的Integer和int等包装类和基本数据类型简单比较
  9. mongoose只更新数组中某一项的字段
  10. 2003 64位系统 IIS6 32位模式运行