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