[LeetCode 일일 질문] - 85. 가장 큰 직사각형

하나 [주제 카테고리]

  • 행렬

두 가지 [질문 난이도]

  • 어려움

세 [화제 번호]

  • 85. 가장 큰 직사각형

네 [제목 설명]

  • 0과 1만 포함하는 행 x 열 크기의 2D 이진 행렬이 주어지면 1만 포함하는 가장 큰 사각형을 찾고 해당 영역을 반환합니다.

다섯 [주제 예]

  • 예 1:

    • 여기에 이미지 설명 삽입
    • 입력: 행렬 = [["1","0","1","0","0"],["1","0","1","1","1"],[ "1", "1", "1", "1", "1"], ["1", "0", "0", "1", "0"]]
    • 출력: 6
    • 설명: 가장 큰 사각형이 위의 그림에 나와 있습니다.
  • 예 2:

    • 입력: 행렬 = []
    • 출력: 0
  • 예 3:

    • 입력: 행렬 = [["0"]]
    • 출력: 0
  • 예 4:

    • 입력: 행렬 = [["1"]]
    • 출력: 1
  • 예 5:

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

여섯 [주제 프롬프트]

  • 행 = = 행렬 . 길이 행 == matrix.length_ _==ma t r i x . 길이 _ _ _ _ _
  • 열 = = 행렬 [ 0 ] . 길이 열 == 행렬[0].길이콜로라도 _ _==행렬 x [ 0 ] . _ _ _ 길이 _ _ _ _ _
  • 1 < = 행, 열 < = 200 1 <= 행, 열 <= 2001<=, _콜로라도 _ _<=200
  • 행렬 [i][j]는 '0' 또는 '1'입니다. 행렬[i][j]는 '0' 또는 '1'입니다.ma t r i x [ i ] [ j ] 0' 또는 1′′

7가지 [문제 해결 아이디어]

  • 먼저 각 위치의 왼쪽에 연속된 '1'의 수를 기록하기 위해 왼쪽 보조 배열을 만듭니다.
  • 그런 다음 2차원 배열의 각 점에 대해 이 점을 오른쪽 아래 모서리로 하는 직사각형의 면적을 계산하고 "상향 확장" 방법을 사용하며 행렬의 너비는 "상향 확장" 과정 및 높이가 현재 위치를 통과합니다. 위치에서 횡단 위치를 빼고 1을 더합니다(배열이 0부터 계산하기 시작하기 때문)
  • 그런 다음 최대 값을 비교하여 가장 큰 직사각형의 면적을 얻습니다.
  • 마지막으로 결과 반환

여덟 【시간 주파수】

  • 시간 복잡도: O ( m 2 n ) O(m^2n)( 2 n)m 、 nm 、 nm n 은 들어오는 2차원 배열의 행과 열의 수입니다.
  • 공간 복잡도: O(mn) O(mn)O ( mn )m、nm、nm n 은 들어오는 2차원 배열의 행과 열의 수입니다.

나인 [코드 구현]

  1. 자바 언어 버전
class Solution {
    
    
    public int maximalRectangle(char[][] matrix) {
    
    
        int m = matrix.length;
        int n = matrix[0].length;
        int[][] left = new int[m][n];
        for(int i = 0;i < m;i++){
    
    
            for(int j = 0;j < n;j++){
    
    
                if(matrix[i][j] == '1'){
    
    
                    left[i][j] = (j == 0 ? 0 : left[i][j - 1]) + 1;
                }
            }
        }
        int res = 0;
        for(int i = 0;i < m;i++){
    
    
            for(int j = 0;j < n;j++){
    
    
                if(matrix[i][j] == '0'){
    
    
                    continue;
                }
                int width = left[i][j];
                int area = width;
                for(int k = i - 1;k >= 0;k--){
    
    
                    width = Math.min(width, left[k][j]);
                    area = Math.max(area,(i - k + 1) * width);
                }
                res = Math.max(res, area);
            }
        }
        return res;
    }
}
  1. C 언어 버전
int maximalRectangle(char** matrix, int matrixSize, int* matrixColSize)
{
    
    
    int m = matrixSize;
    int n = matrixColSize[0];
    int** left = (int **)malloc(sizeof(int*) * m);
    for(int i = 0;i < m;i++)
    {
    
    
        left[i] = (int*)calloc(n, sizeof(int));
    }
    for(int i = 0;i < m;i++)
    {
    
    
        for(int j = 0;j < n;j++)
        {
    
    
            if(matrix[i][j] == '1')
            {
    
    
                left[i][j] = (j == 0 ? 0 : left[i][j - 1]) + 1;
            }
        }
    }
    int res = 0;
    for(int i = 0;i < m;i++)
    {
    
    
        for(int j = 0;j < n;j++)
        {
    
    
            if(matrix[i][j] == '0')
            {
    
    
                continue;
            }
            int width = left[i][j];
            int area = width;
            for(int k = i - 1;k >= 0;k--)
            {
    
    
                width = fmin(width, left[k][j]);
                area = fmax(area, (i - k + 1) * width);
            }
            res = fmax(res, area);
        }
    }
    return res;
}
  1. 파이썬 언어 버전
class Solution:
    def maximalRectangle(self, matrix: List[List[str]]) -> int:
        m = len(matrix)
        n = len(matrix[0])
        left = [[0 for _ in range(n)] for _ in range (m)]
        for i in range(0, m):
            for j in range(0, n):
                if matrix[i][j] == '1':
                    left[i][j] = (0 if j == 0 else left[i][j - 1]) + 1
        res = 0
        for i in range(0, m):
            for j in range(0, n):
                if matrix[i][j] == '0':
                    continue
                width = left[i][j]
                area = width
                for k in range(i - 1, -1, -1):
                    width = min(width, left[k][j])
                    area = max(area, (i - k + 1) * width)
                res = max(res, area)
        return res
  1. C++ 언어 버전
class Solution {
    
    
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
    
    
        int m = matrix.size();
        int n = matrix[0].size();
        vector<vector<int>> left(m, vector<int>(n, 0));
        for(int i = 0;i < m;i++){
    
    
            for(int j = 0;j < n;j++){
    
    
                if(matrix[i][j] == '1'){
    
    
                    left[i][j] = (j == 0 ? 0 : left[i][j - 1]) + 1;
                }
            }
        }
        int res = 0;
        for(int i = 0;i < m;i++){
    
    
            for(int j = 0;j < n;j++){
    
    
                if(matrix[i][j] == '0'){
    
    
                    continue;
                }
                int width = left[i][j];
                int area = width;
                for(int k = i - 1;k >= 0;k--){
    
    
                    width = fmin(width, left[k][j]);
                    area = fmax(area, (i - k + 1) * width);
                }
                res = fmax(res, area);
            }
        }
        return res;
    }
};

텐【투고 결과】

  1. 자바 언어 버전
    여기에 이미지 설명 삽입

  2. C 언어 버전
    여기에 이미지 설명 삽입

  3. 파이썬 언어 버전
    여기에 이미지 설명 삽입

  4. C++ 언어 버전
    여기에 이미지 설명 삽입

추천

출처blog.csdn.net/IronmanJay/article/details/132143936