221最大正方形

题目: 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。

来源: https://leetcode-cn.com/problems/maximal-square/

法一: 自己的代码

思路: 实际上是暴力解法,先记录每个位置向上和向左的可能的正方形边长,在逐个判断是否能够构成正方形.

注意这里要判断观察出正方形的最大边长只与上边,左边,左上的格子中最大正方形的边长有关.不止与上边和左边有关!写出动态转移方程是关键

# 执行用时 :264 ms, 在所有 Python3 提交中击败了35.46% 的用户
# 内存消耗 :15.7 MB, 在所有 Python3 提交中击败了5.32%的用户
from typing import List
import math
class Solution:
    def maximalSquare(self, matrix: List[List[str]]) -> int:
        # print(matrix)
        r = len(matrix)
        if r == 0:
            return 0
        c = len(matrix[0])
        memo = [[0] * c for i in range(r)]
        m = 0
        if matrix[0][0] == ‘1‘:
            memo[0][0] = (1,1,1)
            m = 1
        else:
            memo[0][0] = (0,0,0)
        # 先处理第一行和第一列
        for i in range(1,r,1):
            if matrix[i][0] == ‘1‘:
                memo[i][0] = (1,1,1+memo[i-1][0][2])
                m = 1
            else:
                memo[i][0] = (0,0,0)
        for j in range(1,c,1):
            if matrix[0][j] == ‘1‘:
                memo[0][j] = (1,1+memo[0][j-1][1],1)
                m = 1
            else:
                memo[0][j] = (0,0,0)
        # 判断其余的位置
        for i in range(1,r,1):
            for j in range(1,c,1):
                if matrix[i][j] == ‘1‘:
                    memo[i][j] = (1,1+memo[i][j-1][1],1+memo[i-1][j][2])
                else:
                    memo[i][j] = (0,0,0)
        # 判断是否在斜线上是否能够构成正方形,如果不能返回最小的正方形边长
        def judge(k,i,j):
            r = min(k[1:])
            cou = 1
            while cou < r:
                if min(memo[i-cou][j][1],memo[i][j-cou][2]) >= cou+1:
                    pass
                else:
                    return cou
                cou += 1
            return r
        for i in range(1,r,1):
            for j in range(1,c,1):
                if memo[i][j][0] == 0:
                    continue
                elif min(memo[i][j][1],memo[i][j][2]) > math.sqrt(m):
                    kkk = judge(memo[i][j], i, j)
                    if kkk > math.sqrt(m):
                        m = kkk ** 2
        return m

法二: 别人的代码

思路: 利用备忘录,先对数组加两个0边(注意这里在原list上加边不方便,所以要在备忘录上加边),方便后序的动态规划.要学会这个技巧!

from typing import List
class Solution:
    def maximalSquare(self, matrix: List[List[str]]) -> int:
        if(not matrix):
            return 0
        m=len(matrix)
        n=len(matrix[0])
        res=0
        # dp作为备忘录,记录每个位置的最大正方形的边长
        # 由于在原来的list中加边不方便,在dp中加边.
        dp=[[0]*(n+1) for _ in range(m+1)]
        for i in range(1,m+1):
            for j in range(1,n+1):
                if(matrix[i-1][j-1]=="1"):
                    # 动态转移方程.
                    dp[i][j]=min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])+1
                    res=max(dp[i][j],res)
        return res*res
if __name__ == ‘__main__‘:
    duixiang = Solution()
    # a = duixiang.maximalSquare([["1","0","1","0","0"],
    #                             ["1","0","1","1","1"],
    #                             ["1","1","1","0","1"],
    #                             ["1","0","1","1","1"]]
    #                           )
    a = duixiang.maximalSquare([["0","1","1","0","1"],
                                ["1","1","0","1","0"],
                                ["0","1","1","1","0"],
                                ["1","1","1","1","0"],
                                ["1","1","1","1","1"],
                                ["0","0","0","0","0"]]
                              )
    print(a)

ttt

原文地址:https://www.cnblogs.com/xxswkl/p/12142020.html

时间: 2024-07-31 14:59:00

221最大正方形的相关文章

[leetcode] 221. 最大正方形

221. 最大正方形 其实这题是85. 最大矩形的特殊情况,我们将85题代码稍微改一下,然后直接套用即可. 此题要求是正方形,那么我们在计算长与宽时,取短的那条然后平方即可. class Solution { public int maximalSquare(char[][] matrix) { return maximalRectangle(matrix); } public int maximalRectangle(char[][] matrix) { int m = matrix.leng

[LeetCode] 221. 最大正方形(DP)

题目 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 输出: 4 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximal-square 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. 题解 dp[i][j] 表示以matrix[i-1][j-1]为右下角的最大正方形的边长 转移方

221. 最大正方形

题目: 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0 输出: 4 思路: 动态规划,时间复杂度为O(n^2)dp[i][j]表示以点(i, j)为右下角的正方形的最大边长:状态转移方程:dp[i][j] = min(min(dp[i - 1][j - 1], dp[i][j-1]),min(dp[i-1][j - 1], dp[i - 1][j])) + 1; 当我们

[LeetCode]最大系列(最大正方形221,最大加号标志764)

221. 最大正方形 题目描述: 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 输出: 4 思路: 这道题是动态规划,所以我们要找到动态方程 dp[i][j] = min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1 举个例子 1 0 1 0 0 1 0 1 1 1 1 1 1 2 2 1 0 0 1 0 代码: class Sol

矩阵与动态规划相关

目录 54/59螺旋矩阵 62不同路径 64最小路径和 120三角形最小路径和 695岛屿的最大面积 547朋友圈 718最长重复数组 221最大正方形 121/122/123/714/188买卖股票的最佳时机 416分割等和子集 01背包/最近等分子集 70爬楼梯 54/59螺旋矩阵 思路: 设置上下左右四个边界变量 新建ArrayList存储结果 循环:四个循环,左->右,上->下,右->左,下->上.每次循环添加结果,循环后判断边界是否相等了,是的话就退出 // 设置边界变量

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表

刷题篇--热题HOT 61-70

207.课程表 现在你总共有 n 门课需要选,记为 0 到 n-1.在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习? 示例 1:输入: 2, [[1,0]],输出: true,解释: 总共有 2 门课程.学习课程 1 之前,你需要完成课程 0.所以这是可能的. 示例 2:输入: 2, [[1,0],[0,1]]输出: false,解释: 总共有 2 门课程

[LeetCode] 221. Maximal Square 最大正方形

Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and return its area. For example, given the following matrix: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 Return 4. Credits:Special thanks to @Freezen for addin

Leetcode 221.最大的正方形

最大的正方形 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 输出: 4 判断以某个点为正方形右下角时最大的正方形时,那它的上方,左方和左上方三个点也一定是某个正方形的右下角,否则该点为右下角的正方形最大就是它自己了.这是定性的判断,那具体的最大正方形边长呢?我们知道,该点为右下角的正方形的最大边长,最多比它的上方,左方和左上方为右下角的正方形的边长多1,最好的情