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. 最大正方形-字节跳动高频题的主要内容,如果未能解决你的问题,请参考以下文章

53. 最大子数组和-字节跳动高频题

LeetCode | 221. 最大正方形

字节跳动高频算法题TOP100

字节跳动高频算法题TOP100

字节跳动高频算法题TOP100

leetcode 221. Maximal Square 最大正方形(中等)