LeetCode221 maximal-square(最大正方形)

题目

Given an m x n binary matrix filled with 0's and 1's, find the largest square containing only 1's and return its area.

 Example 1: 
Input: matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1",
"1"],["1","0","0","1","0"]]
Output: 4

 Example 2: 
Input: matrix = [["0","1"],["1","0"]]
Output: 1

 Example 3: 
Input: matrix = [["0"]]
Output: 0

 Constraints: 
 m == matrix.length 
 n == matrix[i].length 
 1 <= m, n <= 300 
 matrix[i][j] is '0' or '1'. 

方法

暴力法

遍历矩阵,以遍历的当前点作为矩阵的左上角,往下找为1的矩阵大小

  • 时间复杂度:O()
  • 空间复杂度:O()

动态规划法

dp[i][j]记录的是以[i,j]坐标为右下角的最大的正方形边长,则[i,j]坐标下的值为它的上方、左上方,左边三点的最小值

  • 时间复杂度:O(m*n),m和n分别是矩阵的长和宽
  • 空间复杂度:O(m*n)
class Solution {
    public int maximalSquare(char[][] matrix) {
        int row = matrix.length, col = matrix[0].length;
        int maxSide = 0;
        int[][] dp = new int[row][col];
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                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-1],dp[i][j-1]),dp[i-1][j])+1;
                    }
                    maxSide = Math.max(maxSide,dp[i][j]);
                }
            }
        }
        return maxSide*maxSide;
    }
}
posted @ 2021-10-26 16:37  你也要来一颗长颈鹿吗  阅读(29)  评论(0)    收藏  举报