LeetCode-Python-302. 包含全部黑色像素的最小矩形

664 篇文章 23 订阅

图片在计算机处理中往往是使用二维矩阵来表示的。

假设,这里我们用的是一张黑白的图片,那么 0 代表白色像素,1 代表黑色像素。

其中黑色的像素他们相互连接,也就是说,图片中只会有一片连在一块儿的黑色像素(像素点是水平或竖直方向连接的)。

那么,给出某一个黑色像素点 (x, y) 的位置,你是否可以找出包含全部黑色像素的最小矩形(与坐标轴对齐)的面积呢?

示例:

输入:
[
  "0010",
  "0110",
  "0100"
]
和 x = 0, y = 2

输出: 6

思路:

找最小矩形的面积,可以转化为找所有黑色像素的X, Y坐标极值,这个面积应该等于:

(self.max_x - self.min_x + 1) * (self.max_y - self.min_y + 1)

所以一趟DFS可以找到所有黑色的点,找到每个点的时候刷新一下极值即可。

class Solution(object):
    def minArea(self, image, x, y):
        """
        :type image: List[List[str]]
        :type x: int
        :type y: int
        :rtype: int
        """
        m, n = len(image), len(image[0])
        visited = [[0 for _ in range(n + 1)] for _ in range(m + 1)]
        
        dx = [1, -1, 0, 0]
        dy = [0, 0, 1, -1]
        self.min_x, self.min_y, self.max_x, self.max_y = 0, 0, 0, 0
        
        def dfs(x0, y0):
            # print (self.min_x, self.min_y, self.max_x, self.max_y, x0, y0)
            self.min_x = min(self.min_x, x0)  
            self.max_x = max(self.max_x, x0)
            self.min_y = min(self.min_y, y0)  
            self.max_y = max(self.max_y, y0)
            visited[x0][y0] = 1
            
            for k in range(4):
                x = x0 + dx[k]
                y = y0 + dy[k]
                
                if 0 <= x < m and 0 <= y < n and visited[x][y] == 0 and image[x][y] == "1":
                    dfs(x, y)
            
        for i in range(m):
            for j in range(n):
                if image[i][j] == "1":
                    self.min_x, self.min_y, self.max_x, self.max_y = i, j, i, j
                    dfs(i, j) #因为全部相连,所以一次主体DFS之后就可以返回
                    # print (self.min_x, self.min_y, self.max_x, self.max_y)        
                    return (self.max_x - self.min_x + 1) * (self.max_y - self.min_y + 1)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值