zoukankan      html  css  js  c++  java
  • [LeetCode] 221. Maximal Square(最大正方形)

    Description

    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.
    给定一个 m x n 的二进制矩阵 matrix,其中每个元素为 01,找到只包含 1 的面积最大的正方形并返回它的面积。

    Examples

    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'.

    Solution

    如果 matrix[i][j] 能组成正方形的一部分,则其左上方的3 个元素也应该是正方形的一部分。

    使用动态规划的方法,记 size[i][j] 表示以 matrix[i][j] 作为右下角的正方形的最大边长,初始时,size[i][j] 均为 0。则:

    1. 只有当 matrix[i][j]1 的时候,才更新 size

    2. size[i][j] = min(size[i - 1][j], size[i][j - 1], size[i - 1][j - 1]) + 1

    第 2 步的 +1 表示如下意思:如果 matrix[i][j] 能够与其他元素构成一个更大的正方形,那么这个正方形的边长会 +1,否则,其本身就是一个 1 x 1 的正方形。

    代码如下:

    import kotlin.math.max
    
    class Solution {
        fun maximalSquare(matrix: Array<CharArray>): Int {
            if (matrix.isEmpty() || matrix[0].isEmpty()) {
                return 0
            }
            val size = Array(matrix.size) { IntArray(matrix[0].size) }
            var maxSize = 0
    
            for (i in matrix.indices) {
                size[i][0] = if (matrix[i][0] == '1') 1 else 0
                maxSize = max(maxSize, size[i][0])
            }
            for (i in matrix[0].indices) {
                size[0][i] = if (matrix[0][i] == '1') 1 else 0
                maxSize = max(maxSize, size[0][i])
            }
    
            for (i in 1..matrix.lastIndex) {
                for (j in 1..matrix[i].lastIndex) {
                    if (matrix[i][j] == '1') {
                        size[i][j] = minOf(size[i - 1][j], size[i][j - 1], size[i - 1][j - 1]) + 1
                        maxSize = max(maxSize, size[i][j])
                    }
                }
            }
    
            return maxSize * maxSize
        }
    }
    
  • 相关阅读:
    C#演练—Windows应用程序—在windows窗体上动态创建上下文菜单
    C#演练—Windows应用程序—可视化继承
    C#演练—Windows应用程序—创建主从windows窗体
    小胖IT大讲堂之三 Hook实战(二) SQL Monitor山寨版
    小胖的2011总结之回忆篇
    Oracle安装示例数据库
    《领域驱动设计》读书笔记(一) 分离领域
    小胖IT大讲堂之一 .NET Reflector工具介绍
    10年前我不是小胖,也是个“诗人”
    忘记
  • 原文地址:https://www.cnblogs.com/zhongju/p/14084307.html
Copyright © 2011-2022 走看看