221. 最大正方形-字节跳动高频题
Posted hequnwang10
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了221. 最大正方形-字节跳动高频题相关的知识,希望对你有一定的参考价值。
一、题目描述
在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。
示例 1:
输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:4
示例 2:
输入:matrix = [["0","1"],["1","0"]]
输出:1
示例 3:
输入:matrix = [["0"]]
输出:0
二、解题
动态规划
这题使用动态规划
dp(i,j) 表示以 (i,j) 为右下角,且只包含 1 的正方形的边长最大值
初始化:先将第一行和第一列初始化。
class Solution
public int maximalSquare(char[][] matrix)
int m = matrix.length,n = matrix[0].length;
//dp[i][j]表示以i和j为右下边的点的正方形的长度
//dp(i,j) 表示以 (i,j) 为右下角,且只包含 1 的正方形的边长最大值
int[][] dp = new int[m][n];
if(matrix == null || m<0 || n<0)
return 0;
int max = 0;
//先将第一行和第一列填充
//第一行填充
for(int i = 0;i<n;i++)
if(matrix[0][i] == '1')
dp[0][i] = 1;
max = 1;
//将第一列填充
for(int i = 0;i<m;i++)
if(matrix[i][0] == '1')
dp[i][0] = 1;
max = 1;
//从第二行第二列开始遍历
for(int i = 1;i<m;i++)
for(int j = 1;j<n;j++)
if(matrix[i][j] == '0')
dp[i][j] = 0;
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(max,dp[i][j]);
return max*max;
以上是关于221. 最大正方形-字节跳动高频题的主要内容,如果未能解决你的问题,请参考以下文章