来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximal-square
在一个由 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和0进行分割,划分成为不同的堆,其中1和1之间只要有相连就划分为一个堆(相连表示在水平或者垂直方向是相连的),然后再在1这个堆里面找到最大的正方形。但是仔细思考之后发现这么做并没有解决这个问题的核心点,最后还是要回到从矩阵中找到最大的正方形。后来看了别人的题解,思路为将矩阵中的每一行都看做是一个二进制数然后让它和后面的行进行&运算再找出运算结果中最大的相连的1的数量,那么正方形的边长就是max(j-i+1,相连1的数量)(i和j表示第几行)。AC代码如下:
class Solution: def maximalSquare(self, matrix: List[List[str]]) -> int: # 将矩阵中的每一行都华为一个二进制数 nums = [int(''.join(n), base=2) for n in matrix] res, n = 0, len(nums) # 遍历二进制数数组 for i in range(n): temp = nums[i] for j in range(i, n): temp &= nums[j] w = self.get_width(temp) # 得到正方形的宽 h = j - i + 1 res = max(res, min(w, h)) return res * res # 找到二进制数中相连1的数目 def get_width(self, num): w = 0 while num > 0: num &= num << 1 w += 1 return w