图片在计算机处理中往往是使用二维矩阵来表示的。
假设,这里我们用的是一张黑白的图片,那么 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)