【力扣100】【好题】200.岛屿数量

添加链接描述

解法一:dfs

class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        # 思路是dfs,使用一个指针遍历元素,如果找到1,就递归把跟这个1连着的1都变成0,用result记录结果
        if not grid or len(grid)==0:
            return 
        result=0

        def dfs(grid,x,y,row,col):
            if x<0 or y<0 or x>row or y>col or grid[x][y]=='0':
                return 
            grid[x][y]='0'
            dfs(grid,x+1,y,row,col)
            dfs(grid,x-1,y,row,col)
            dfs(grid,x,y+1,row,col)
            dfs(grid,x,y-1,row,col)

        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if grid[i][j]=='1':
                    result+=1
                    dfs(grid,i,j,len(grid)-1,len(grid[0])-1)
        return result

思路:

  1. 把找到的1用递归的思路把它和它相邻的1都变成0
  2. 这样就可以一块一块的把所有相邻的岛屿找到

解法二:bfs

class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        # 思路是使用bfs,使用队列对整个海域进行同化,也是把遇见的1都变为0
        if not grid or len(grid)==0:
            return 
        que=collections.deque()
        reslut=0
        row=len(grid)
        col=len(grid[0])
        for i in range(row):
            for j in range(col):
                if grid[i][j]=='1':
                    reslut+=1
                    que.append([i,j])
                    grid[i][j]='0'
                    while que:
                        cur=que.popleft()
                        x=cur[0]
                        y=cur[1]
                        if x-1>=0 and grid[x-1][y]=='1':
                            que.append([x-1,y])
                            grid[x-1][y]='0'
                        if y-1>=0 and grid[x][y-1]=='1':
                            que.append([x,y-1])
                            grid[x][y-1]='0'
                        if x+1<row and grid[x+1][y]=='1':
                            que.append([x+1,y])
                            grid[x+1][y]='0'
                        if y+1<col and grid[x][y+1]=='1':
                            que.append([x,y+1])
                            grid[x][y+1]='0'
        return reslut

思路:

  1. 使用bfs,使用队列,依然是把遍历到的1变成0,然后再找到这个1的上下左右,扫荡变为0
  2. 使用队列维护这个循环,注意放入队列中的是坐标,而不是节点
  3. 因为只有放坐标进去,我们才能对这个坐标的awsd进行扫荡

解法三:unionfind

未完待续…

你可能感兴趣的:(leetcode,算法)