[Leedcode][JAVA][第85题][第221题][最大正方形][动态规划]
【问题描述】[第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题][最大正方形][动态规划]相关推荐
- [Leedcode][JAVA][第105题][从前序与中序遍历序列构造二叉树][栈][递归][二叉树]
[问题描述][中等] 根据一棵树的前序遍历与中序遍历构造二叉树.注意: 你可以假设树中没有重复的元素.例如,给出前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = ...
- [Leedcode][JAVA][第470题][Ran7()实现Rand10()]
[问题描述][Leedcode][JAVA][第470题][Ran7()实现Rand10()] 已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 ...
- [Leedcode][JAVA][第45题][跳跃游戏 II][贪心算法]
[问题描述][Leedcode][JAVA][第45题][跳跃游戏 II] 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2.从下标为 0 跳到下标为 1 的位置 ...
- [Leedcode][JAVA][第4题][寻找两个正序数组中的中位数][二分查找][双指针]
[问题描述][困难] 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)).你可以假设 ...
- Java入门基础及面试100题--初入门
Java入门基础及面试100题 注:适合应届毕业生或java初入门者 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程, ...
- Day5.牛客网剑指offer 67题之43-54题(java代码)
文章目录 Day5.牛客网剑指offer 67题之43-54题 43.左旋转字符串 44.翻转单词顺序列 45.扑克牌顺序 46.孩子们的游戏 47.求1+2+...+n 48.不用加减乘除做加法 4 ...
- 2021年 第12届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2021.04.18】
蓝桥杯 Java B组 省赛决赛 真题详解及小结汇总[题目下载.2013年(第4届)~2020年(第11届)] CSDN 蓝桥杯 专栏 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结 ...
- java计算机毕业设计软考刷题系统源码+mysql数据库+系统+lw文档+部署
java计算机毕业设计软考刷题系统源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计软考刷题系统源码+mysql数据库+系统+lw文档+部署 本源码技术栈: 项目架构:B/S架构 开 ...
- java程序设计模拟题_《Java程序设计》东师模拟题题目及答案
<Java程序设计>东师模拟题题目及答案 2020-08-30 09:08:37 931 有学员问关于<Java程序设计>东师模拟题题目及答案的题目的参考答案和解析,具体如下: ...
最新文章
- Scala元组:存放各种相同或不同类型的数据
- k1075停运吗_怀化火车站(怀化火车停运最新消息)
- LightSwitch中的权限
- [html] H5播放的video视频,如何实现对视频截图?
- Linux系统编程 -- 信号及signal函数
- Seek and Destroy
- 计算机基础硬件知识试题及答案,计算机基础知识试题及答案大全(总结一)
- Android音视频开发(一)音视频基础知识
- 产品经理面试常见问题及答案参考总结(一)
- mysqldump --set-gtid-purged=OFF
- Solving environment: failed
- 以数据驱动的支付场景数字营销,能否成为下一个...
- 小程序团购商品CPS接入,实现达人分佣模式
- 解决共享文件夹不显示以及VMware-tools的重装问题
- CENTOS上的网络安全工具(九)走向Hadoop(1) SingleNode模式安装与配置
- [附源码]计算机毕业设计宁财二手物品交易网站Springboot程序
- 五次面试,程序员的悲催轮回
- 单链表的Java简单实现
- 【迪大学院】X64X86游戏安全逆向分析相关所有视频链接
- 某软件平台定制开发项目技术标书
热门文章
- java中sesion
- [禅悟人生]心平气和, 慢慢修行
- 写一个简单控制台启动的mcv服务
- 3389爆破DUBrute_2.1
- 基于visual Studio2013解决面试题之0203栈实现
- can't load apple.laf.AquaLookAndFeel (Ant in Eclipse can't find it
- java做报表_一步一步使用POI做java报表
- integer对应java类型_Java中的Integer和int等包装类和基本数据类型简单比较
- mongoose只更新数组中某一项的字段
- 2003 64位系统 IIS6 32位模式运行