1. 程式人生 > >leetcode200---並查集實現

leetcode200---並查集實現

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
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

注意的是,當倆個相鄰節點的祖先不同時,應該更新節點的祖先的祖先。

最後,可能有某些節點的祖先還沒更新到,集中處理一下

全部程式碼:

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)