DEnjoy

导航

python leetcode 日记--Maximal Square--221

题目:

Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 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.

本题为一个典型的动态规划问题,因此可以使用动态规划的思想进行。

step1,初始化原始行和列

step2,构建存储结果矩阵(其大小与原始问题空间一样)

step3,对结果矩阵进行遍历找出最优解

其中,step2是动态规划的核心,其主要思想为将整个问题划分为若干个子问题,对于每个子问题,都可以借助其他子问题的解来得到自己的解;

那么对应到问题中核心思想如何理解呢?

 

1 1 1 1
1 1 0 1
0 1 0 1
1 1 1 1

如上这个4*4表格,首先我们假定是有当前位置相左上方画正方形,那么(0,0)位置开始,初始化时仅看第一行第一列,因为是边界,因此如果值等于1,那么表示可以画出一个1单位长度的正方形满足题意。若等于0,则表示没有满足的正方形。根据此原则,结果矩阵第一行为(1,1,1,1)第一列为(1,1,0,1),然后从(1,1)位置开始遍历剩余的位置。那么怎么划分子问题呢?其实划分子问题已经开始了,比如现在在(1,1)位置,因为此位置已经为1,如果(1,1)左上方的三个位置都为的话,那么对于(1,1)这个位置的对应的结果矩阵就可以为2,而要知道剩下三个位置是否为1,只需要查那三个位置的结果矩阵即可,因为结果矩阵纪录了能够画出多少个单位长度的正方形,根据这个原理,只要找到三个中的最小值,在加上自己的这个位置,就可以得到结果。这样遍历下来,结果矩阵就纪录了从此点向左上方画正方形所满足题意的最大值

 本人的实现代码如下:

class Solution(object):
    def maximalSquare(self, matrix):
        if not matrix:
            return 0
        lines=len(matrix)
        lists=len(matrix[0])
        mat=[[0]*lists for i in range(lines)]
#初始化
for i in range(lists): mat[0][i]=int(matrix[0][i]) for i in xrange(lines): mat[i][0]=int(matrix[i][0]) result=0
#构造结果矩阵
for i in xrange(1,lines): for j in xrange(1,lists): mat[i][j]=int(matrix[i][j]) if mat[i][j] is not 0: mat[i][j]=(min(mat[i-1][j-1],mat[i][j-1],mat[i-1][j])+1) result=0
#遍历结果矩阵得到结果
for i in mat: for j in i: if result<j: result=j return result**2

 

posted on 2016-05-10 23:08  DEnjoy  阅读(557)  评论(0编辑  收藏  举报