leetcode-200-岛屿数量

题目描述:

 方法一:dfs

class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        def dfs(grid,r,c):
            nr = len(grid)
            nc = len(grid[0])
            if   r<0 or c<0 or r==nr or c==nc or grid[r][c]=='0':
                return
            grid[r][c] = '0'
            dfs(grid,r-1,c)
            dfs(grid,r+1,c)
            dfs(grid,r,c-1)
            dfs(grid,r,c+1)
        if not grid:
            return 0
        nr = len(grid)
        nc = len(grid[0])
        num = 0
        for i in range(nr):
            for j in range(nc):
                if grid[i][j]=='1':
                    num += 1
                    dfs(grid,i,j)
        return num

另:

class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        def dfs(grid,r,c,marked):
            marked[r][c] = True
            nr = len(grid)
            nc = len(grid[0])
            for d in directions:  
                new_r = r + d[0]
                new_c = c + d[1]
                if 0 <= new_r < nr and 0 <= new_c < nc and not marked[new_r][new_c] and grid[new_r][new_c] == '1': 
                    dfs(grid, new_r, new_c, marked)

        if not grid:
            return 0
        nr = len(grid)
        nc = len(grid[0])
        num = 0
        directions = [(-1, 0), (0, -1), (1, 0), (0, 1)]
        marked = [[False for _ in range(nc)]for _ in range(nr)]
        for i in range(nr):
            for j in range(nc):
                if not marked[i][j] and grid[i][j]=='1':
                    num += 1
                    dfs(grid,i,j,marked)
        return num

方法二:bfs

from collections import deque
class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        if not grid:
            return 0
        nr = len(grid)
        nc = len(grid[0])
        num = 0
        directions = [(-1, 0), (0, -1), (1, 0), (0, 1)]
        marked = [[False for _ in range(nc)]for _ in range(nr)]
        for i in range(nr):
            for j in range(nc):
                if not marked[i][j] and grid[i][j]=='1':
                    num += 1
                    queue = deque()
                    queue.append((i,j))
                    marked[i][j] = True
                    while queue:
                        r,c = queue.popleft()
                        for d in directions:  
                            new_r = r + d[0]
                            new_c = c + d[1]
                            if 0 <= new_r < nr and 0 <= new_c < nc and not marked[new_r][new_c] and grid[new_r][new_c] == '1': 
                                queue.append((new_r,new_c))
                                marked[new_r][new_c] = True

        return num

方法三:并查集

class Solution:
    def findroot_withcom(self,par,x): 
        r=x 
        while par[r]!=r: 
            par[r]=par[par[r]] 
            r=par[r] 
        return par,r

    def numIslands(self, grid: List[List[str]]) -> int:
        if not grid:
            return 0
        nr = len(grid)
        nc = len(grid[0])
        par = {}
        for i in range(nr):
            for j in range(nc):
                if grid[i][j]=='1':
                    if (i-1,j) not in par: 
                        if (i,j-1) not in par: 
                            par[(i,j)]=(i,j) 
                        else: 
                            par[(i,j)]=par[(i,j-1)] 
                    else: 
                        if (i,j-1) not in par: 
                            par[(i,j)]=par[(i-1,j)] 
                        else: 
                            par[(i,j)]=par[(i-1,j)] 
                            par,x=self.findroot_withcom(par,(i,j-1)) 
                            par[x]=par[(i-1,j)]
        roots=[] 
        res=0 #最后数数一共几个不同的根 
        for x in par: 
            par,y=self.findroot_withcom(par,x) 
            if y not in roots:
                roots.append(y) 
                res+=1 
        return res

 

---恢复内容结束---

posted @ 2019-07-30 15:46  oldby  阅读(255)  评论(0编辑  收藏  举报