Leetcode 0221 : 최대 제곱

제목 설명:

0과 1로 채워진 mxn 이진 행렬이 주어지면 1 만 포함 된 가장 큰 정사각형을 찾아 그 면적을 반환합니다.

예 1 :
여기에 사진 설명 삽입

입력 : 행렬 = [[ "1", "0", "1", "0", "0"], [ "1", "0", "1", "1", "1"], [ "1", "1", "1", "1", "1"], [ "1", "0", "0", "1", "0"]]
출력 : 4

예 2 :

입력 : 행렬 = [[ "0", "1"], [ "1", "0"]]
출력 : 1

예 3 :

입력 : 행렬 = [[ "0"]]
출력 : 0

제약 :

m == matrix.length
n == matrix [i] .length
1 <= m, n <= 300
matrix [i] [j]는 '0'또는 '1'입니다.

시간 복잡도 : O (nm)
동적 프로그래밍 :
상태 표현 : dp [i] [j]는 (i, j)가 오른쪽 하단 모서리 인 가장 큰 정사각형의 측면 길이를 나타냅니다.
상태 전환 :
(i, j)가 가장 큰 값 오른쪽 아래 모서리 정사각형의 변 길이는 인접한 위쪽 변 (i-1, j), 왼쪽 (i, j-1), 왼쪽 위쪽 (i-1, j-1)에 따라 달라집니다. 이 세 점의 가장 큰 제곱은 세 점의 최소값 +1

class Solution {
    
    
    public int maximalSquare(char[][] matrix) {
    
    
        int m = matrix.length;
        int n = matrix[0].length;
        int[][] dp = new int[m+1][n+1];
        int res = 0;
        for(int i = 1; i <= m; i++){
    
    
            for(int j = 1; j <= n; j++){
    
    
                if(matrix[i-1][j-1] == '1'){
    
    
                    dp[i][j] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;
                    res = Math.max(res,  dp[i][j]);
                }
            }
        }
        return res*res;
    }
}

추천

출처blog.csdn.net/weixin_43946031/article/details/113840913