221. 最大正方形-字节跳动高频题

221. 最大正方形-字节跳动高频题,第1张

一、题目描述

在一个由 ‘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;        
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/674960.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存