LeetCode:221 Maximal square

problem

Given a 2D binary matrix filled with 0’s and 1’s, find the largest square containing only 1’s and return its area

solution

思路:

一个方正全是1,就是12and 22 and 32,
边长相等全是1,
怎么搜索才能是最优化的
先从最简单的暴力搜索开始分析,后面才能有更多的思路
和那个求小岛数量的不一样,这个是其中能成形的方形
遇见1,我就开始用边界范围限制来查找,你可能会查找三个方向,每个点都要遍历,在每个点基础之上都有可能遍历n边,效率是n三次方,肯定过不了
能不能想想怎么优化?
好吧,我放弃

方法一:暴力求解

代码 python

class Solution:
    def search(self,matrix,x,y,height,width)->int:
        maxlength=0
        circle=height-x if height-x<width-y else width-y
        for c in range(1,1+circle):
            for i in range(x,x+c):
                for j in range(y,y+c):
                    if matrix[i][j]=='0':
                        return maxlength
            maxlength+=1
        return maxlength


    def maximalSquare(self, matrix) -> int:
        height=len(matrix)
        if height==0:
            return 0
        width=len(matrix[0])
        maxquare=0
        for i in range(height):
            for j in range(width):
                if matrix[i][j]=='1':
                    maxquare=max(self.search(matrix,i,j,height,width),maxquare)
        return maxquare**2

没想到的是,暴力(burte force)居然通过了∑( 口 ||)

方法二:动态规划

思路
自己的思路确实局限了,以为又会是什么奇巧的方法,但没想到就是动态规划,看来还是没有深刻理解到动态规划的精髓 leetcode 解题连接

其次,给出的很多解题都用了额外的开销,我自己想了想是不是可以就在原来matrix来表示

在原地表示是可行的,但是你必须得初始化一些初始条件,比如第一排,第一列,比如只有一列和一排得情况,很多的开销也就由此产生了

其中,还有很多的bug条件我没考虑到,导致我debug了较长时间

所以,最后跑下来发现内存也并没有节省下来,反倒给自己带来了一堆边界条件的麻烦

有时候想节省下空间,一定要考虑清楚处理其所带来的其他条件,有时可能会很繁杂
代码 python

class Solution:
    def search(self,matrix,x,y,height,width)->int:
        maxlength=0
        circle=height-x if height-x<width-y else width-y
        for c in range(1,1+circle):
            for i in range(x,x+c):
                for j in range(y,y+c):
                    if matrix[i][j]=='0':
                        return maxlength
            maxlength+=1
        return maxlength


    def maximalSquare(self, matrix) -> int:
        height=len(matrix)
        if height==0:
            return 0
        width=len(matrix[0])
        maxquare=0
        for i in range(height):
            for j in range(width):
                if matrix[i][j]=='1':
                    maxquare=max(self.search(matrix,i,j,height,width),maxquare)
        return maxquare**2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值