leetcode200---並查集實現
阿新 • • 發佈:2019-02-15
Given a 2d grid map of '1'
s (land) and '0'
s (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
Example 1:
11110 11010 11000 00000
Answer: 1
Example 2:
11000 11000 00100 00011
使用並查集的資料結構實現這個問題
查詢:
def find(m): if m!=zuxian[m]: zuxian[m]=find(zuxian[m]) return zuxian[m]用一個遞迴的過程,及時更新每個節點新的祖先
合併:
def union(): for i in range(self.num): r,c=i/self.col,i%self.col if grid[r][c]!='0': if注意的是,當倆個相鄰節點的祖先不同時,應該更新節點的祖先的祖先。
最後,可能有某些節點的祖先還沒更新到,集中處理一下
全部程式碼:
class Solution(object): def numIslands(self, grid): def initial(): for i in range(self.num): zuxian[i]=i if grid[i/self.col][i%self.col]=='1' else -1 def find(m): if m!=zuxian[m]: zuxian[m]=find(zuxian[m]) return zuxian[m] def union(): for i in range(self.num): r,c=i/self.col,i%self.col if grid[r][c]!='0': if r!=0 and c!=0 and grid[r-1][c]=='1' and grid[r][c-1]=='1': zuxian[i]=zuxian[find((r-1)*self.col+c)]=zuxian[find(r*self.col+c-1)]=min([find((r-1)*self.col+c),find(r*self.col+c-1)]) else: if r!=0 and grid[r-1][c]=='1': zuxian[i]=find((r-1)*self.col+c) if c!=0 and grid[r][c-1]=='1': zuxian[i]=find(r*self.col+c-1) for i in range(self.num): zuxian[i]=find(i) if grid[i/self.col][i%self.col]=='1' else -1 def totalzuxian(): result=set() for i in range(self.num): if zuxian[i]>=0: result.add(zuxian[i]) return len(result) if grid==[]: return 0 self.row,self.col=len(grid),len(grid[0]) self.num=self.row*self.col zuxian=[0]*self.num initial() union() return totalzuxian()g=['11110','11010','11000','00000']
gg=[
'11000','11000','00100','00011']ggg = ['10111', '10101', '11101']s=Solution()print s.numIslands(ggg)