221. 最大正方形
2023-04-18 16:12:50 时间
一 . 题目
二. 思路:
我们用 dp(i,j) 表示以 (i, j)(i,j) 为右下角,且只包含 1 的正方形的边长最大值。 如果我们能计算出所有dp(i,j) 的值,那么其中的最大值即为矩阵中只包含 11 的正方形的边长最大值,其平方即为最大正方形的面积。
那么如何计算 extit{dp}dp 中的每个元素值呢?对于每个位置 (i, j)(i,j),检查在矩阵中该位置的值:
- 初始值问题:如果matrix[i][j]=0,则dp[i][j]=0
- 边界问题:如果matrix[i][j]=1情况下i=0||j=0,则
- 递归问题 dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]) (递归公式证明)
三 代码:
class Solution {
//初始值问题:如果matrix[i][j]=0,则dp[i][j]=0
//边界问题:如果matrix[i][j]=1情况下i=0||j=0,则
//递归问题 dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])
public int maximalSquare(char[][] matrix) {
//max存储最大边长
int max=0;
if (matrix==null||matrix.length==0||matrix[0].length==0){
return max;
}
//初始化dp
int[][] dp=new int[matrix.length][matrix[0].length];
int rows=matrix.length;
int columns=matrix[0].length;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
//这里不用写等于0的代码,参见1,而基础类型默认值就是0,因此代码不用写
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;
}
max=Math.max(dp[i][j],max);
}
}
}
return max*max;
}
}
相关文章
- 如何在腾讯云服务器上安装Jupyter Notebook示例?
- linux系统下用ssh命令安全连接客户端
- linux磁盘挂载与卸除的命令方法
- linux磁盘格式化的操作命令
- linux操作系统添加批量用户的命令方法
- linux系统使用df命令显示磁盘空间使用情况
- linux系统使用quotacheck命令扫描获取磁盘信息
- centos系统下使用tftp命令上传及下载文件的方法
- 使用setquota命令设置文件系统配额
- Go语言核心36讲(Go语言实战与应用十七)--学习笔记
- 远程桌面的窗口最小化或关闭,影响模拟键盘鼠标的脚本
- 2021-11-29:给定一个单链表的头节点head,每个节点都有v
- windows磁盘压测工具
- 关于模拟器
- Echo 框架:开启 TLS/SSL
- WordPress环境搭建及安装配置
- 大数据ELK(十三):Elasticsearch编程(添加职位数据)
- UML
- 谷歌高频面试题-较小的三数之和
- 二分查找不同模板分析与比较