leeicode第200题,本质上就是寻找最大连通域的块数。
这个题可以用很多方法求解,标签提示可以用广搜深搜,在这里使用了并查集。
这个题的并查集使用需要一定的技巧,首先并查集的基本操作基本没有什么差别,但是为了统计并查集的个数,可以事先统计一下1的个数,每次把一个新的1元素并入集合的同时就自减,这样最后剩余的就是集合个数了,无须再次遍历。
另外就是并查集储存什么值的问题了,一开始我想储存二维坐标对,后来发现完全可以用一个数字代表。
由遍历方向可知,我们每次搜索只需要向右边和下方进行试探即可,因为上方和左方都已经遍历过了。由于并查集的合并操作有着自动检查是否属于同一集合的功能,因此也就不用担心会出现重复情况了。
class Solution(object):
def numIslands(self, grid):
"""
:type grid: List[List[str]]
:rtype: int
"""
row = len(grid)
if row == 0:
return 0
col = len(grid[0])
self.count = sum(grid[i][j]=='1' for i in range(row) for j in range(col))
parent = [i for i in range(row*col)]
def find(x):
if parent[x] != x:
return find(parent[x])
return parent[x]
def union(x,y):
a = find(x)
b = find(y)
if a == b:
return
parent[a] = b
self.count -= 1
for i in range(row):
for j in range(col):
if grid[i][j] == '0':continue
index = i*col+j
if j < col-1 and grid[i][j+1] == '1':
union(index,index+1)
if i < row-1 and grid[i+1][j] == '1':
union(index,index+col)
return self.count