【LeetCode笔记】221. 最大正方形(Java、动态规划、思路题)
文章目录
- 题目描述
- 思路 & 代码
- 更新版
题目描述
- 显而易见地可以用dp来写,问题在于如何考虑状态转移方程
思路 & 代码
- 首先再加一层外墙,就不用边界判断了
- maxSqure[i]:以当前格子为右下角的正方形,可达到的最大边长
- 这是由左、上、左上三个格子的maxSqure来决定的(类似木桶短板)
- 借用一下leetcode题解中 lzhlyle 大佬的图,这个0限制我没太理解,这里说说我的理解吧:
三个图分别代表全部可能的三种情况:左上小了、上小了、左小了
对于这三种情况,我们发现采取的值都遵循这个规律:直接取三者中最小的值即可
由此可以得到状态转移方程(见代码)
class Solution {public int maximalSquare(char[][] matrix) {int m = matrix.length;int n = matrix[0].length;int maxSide = 0;// maxSqure[i][j]:以当前块为右下角,可构造成的最大正方形的边长// 默认给上、左加上一层初始化的0int[][] maxSqure = new int[m + 1][n + 1];for(int i = 1; i <= m; i++){for(int j = 1; j <= n; j++){if(matrix[i-1][j-1] == '1'){// 思考,可以分成上、左、左上三个格子分别为短板的情况,然后此时如何取得min值来得出“三者取最小”的情况maxSqure[i][j]=Math.min(Math.min(maxSqure[i-1][j-1],maxSqure[i-1][j]),maxSqure[i][j-1]) + 1;maxSide = Math.max(maxSqure[i][j], maxSide);}}}return maxSide * maxSide;}
}
- 时间复杂度 O(m * n),空间复杂度 O(m * n)
更新版
class Solution {public int maximalSquare(char[][] matrix) {int[][] maxSquareSize = new int[matrix.length + 1][matrix[0].length + 1];int resSize = 0;for(int i = 1; i <= matrix.length; i++) {for(int j = 1; j <= matrix[0].length; j++) {if(matrix[i - 1][j - 1] == '1') {maxSquareSize[i][j] = Math.min(maxSquareSize[i - 1][j], maxSquareSize[i][j - 1]);maxSquareSize[i][j] = Math.min(maxSquareSize[i][j], maxSquareSize[i - 1][j - 1]);resSize = Math.max(resSize, ++maxSquareSize[i][j]);}}}return resSize * resSize;}
}
【LeetCode笔记】221. 最大正方形(Java、动态规划、思路题)相关推荐
- 【LeetCode笔记】238. 除自身以外数组的乘积(Java、思路题)
文章目录 题目描述 思路 & 代码 更新版 题目描述 首先暴力二层循环肯定可以,然后先累乘整个数组,再用除法肯定也行. 但是很遗憾,两种做法都不满足题目说明. 思路 & 代码 O(n) ...
- [leetcode日记]221.最大正方形
题目 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 输出: 4 ...
- leetcode 221. Maximal Square | 221. 最大正方形(优化的暴力解法+动态规划解法)
题目 https://leetcode.com/problems/maximal-square/ 题解 方法1:最暴力解 O((m*n)^2) public class Solution {publi ...
- [LeetCode刷题笔记]714 - 买卖股票的最佳时机含手续费(C++/Python3/Java/动态规划/贪心)
一.题目描述 给定一个整数数组 prices 和 整数 fee ,其中 prices[i] 表示第 i 天的股票价格,fee 代表了交易股票的手续费用. 你可以无限次地完成交易,但是你每笔交易都需要付 ...
- 【LeetCode笔记】198. 打家劫舍(Java、动态规划)
文章目录 题目描述 思路 & 代码 更新版 题目描述 好家伙,真是一道不符合社会主义价值观的题目 不过我们还是要把这道题做了,而且还得用上动态规划 思路 & 代码 首先,不能打劫相邻 ...
- LeetCode Top 100 Liked Questions 221. Maximal Square (Java版; Medium)
welcome to my blog LeetCode Top 100 Liked Questions 221. Maximal Square (Java版; Medium) 题目描述 Given a ...
- LeetCode—笔记—51、N皇后——递归回溯,个人思路,简单易懂
LeetCode-笔记-51.N皇后--递归回溯,个人思路,简单易懂 51. N 皇后 n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给你一个整数 ...
- leetcode 375. Guess Number Higher or Lower II | 375. 猜数字大小 II(动态规划思路总结)
题目 https://leetcode.com/problems/guess-number-higher-or-lower-ii/ 题解 首先,看了 Related Topics,知道这是个 dp 问 ...
- LeetCode—221. 最大正方形
221. 最大正方形 题目描述: 在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积. 考察重点:动态规划 方法概括:二维矩阵中查询最大矩形 dp[i][j ...
- 学习笔记 - 动态规划做题思路
目录 一 . 什么是动态规划? 二.什么问题能用动态规划? 三.动态规划思路 一 . 什么是动态规划? 上一篇文章已经讲了动态规划是什么,按我个人的理解来说 动态规划就是一种 将一个大问题分解为各个独 ...
最新文章
- Python使用matplotlib可视化多个时间序列数据、添加双Y轴、以显示具有不同尺度的时间序列数据(secondary y axis)
- linux php 如何停止,如何关闭linux
- 谈谈对Kafka Accumulator的理解
- 10个经典而简单的jQuery特效设计在线演示
- 基于matlab的点云重建与三角剖分
- linux加载虚拟sriov网卡,如何配置BroadCOM网卡的SR-IOV功能
- #{}和${}的区别是什么?
- c语言网页版在线编译器_C语言编译器IDEapp下载-C语言编译器IDE官方版下载v1.5.1 安卓版...
- Qt creator5.7 OpenCV249之图片灰度处理(含源码下载)
- bat 等待输入_bat-批量修改文件或者文件夹名称
- 下面对html描述正确的有多选题,YS - 《网页制作》复习题(多选题)
- Ubuntu操作-01 安装NVIDIA显卡驱动
- 【组合优化】旅行商问题Traveling Salesman Problem(TSP)-概述
- 国际贸易术语解释通则(DEQ 目的港码头交货(……指定目的港))
- 未来交通 | 中国二十城出行者“MaaS及共享出行体验”初探索
- windows10 更换密码
- 起诉传音,华为为何会对一张壁纸要价2000万?
- 高阳:我是黑客我怕谁
- IOS 图片点击放大不失真
- 移动IP的作用及意义
热门文章
- 欧氏空间内积定义_MP5:内积、外积、面积、Hermite内积、辛内积
- mysql事务嵌套 php_使用以下代码,MySQL中的PHP“嵌套”事务是否...
- ios请求头解决参数中文乱码_花了一天时间就解决了一个的请求头传参参数格式bug...
- IEEE选择和下载投稿期刊模板(LaTeX和Word)网站
- 实验四51单片机并口实验
- 《Pycharm操作和配置指南》这些不会,写Python肯定慢嘛
- PDF签名系列(1):PDF签名机制的漏洞分析
- 【itext学习之路】--6.将html转成pdf(解决中文不显示)
- linux 串口读取陀螺仪,stm32读取陀螺仪MPU6050发送数据到串口
- lisp语言画阿基米德线_【R语言】如何将照片快速转换为素描