200. Number of Islands

  1. class Solution:
  2. def numIslands(self, grid: List[List[str]]) -> int:
  3. # 将(i, j)的island转化为water
  4. def dfs(i, j):
  5. if not 0 <= i < m or not 0 <= j < n or grid[i][j] == '0':
  6. return
  7. grid[i][j] = '0'
  8. for u, v in [i-1, j], [i+1, j], [i, j-1], [i, j+1]:
  9. dfs(u, v)
  10. m, n = len(grid), len(grid[0])
  11. res = 0
  12. for i in range(m):
  13. for j in range(n):
  14. if grid[i][j] == '1':
  15. dfs(i, j)
  16. res += 1
  17. return res
  • 时间复杂度:深度优先搜索 DFS - 图1
  • 空间复杂度:深度优先搜索 DFS - 图2

bfs注意在加入队列之前,将岛屿置为0

  1. class Solution:
  2. def numIslands(self, grid: List[List[str]]) -> int:
  3. m, n = len(grid), len(grid[0])
  4. num_islands = 0
  5. for i in range(m):
  6. for j in range(n):
  7. if grid[i][j] == '1':
  8. num_islands += 1
  9. grid[i][j] = '0' # 1.陆地起始点
  10. queue = collections.deque([(i, j)])
  11. while queue:
  12. r, c = queue.popleft()
  13. for u, v in [r-1, c], [r+1, c], [r, c-1], [r, c+1]:
  14. if 0 <= u < m and 0 <= v < n and grid[u][v] == '1':
  15. grid[u][v] = '0' # 2.陆地连接点
  16. queue.append((u, v))
  17. return num_islands
  1. class Solution:
  2. def numIslands(self, grid: List[List[str]]) -> int:
  3. m, n = len(grid), len(grid[0])
  4. def bfs(i, j):
  5. queue = collections.deque([[i, j]])
  6. while queue:
  7. i, j = queue.popleft()
  8. if 0 <= i < m and 0 <= j < n and grid[i][j] == '1':
  9. grid[i][j] = '0'
  10. queue += [[i - 1, j], [i + 1, j], [i, j - 1], [i, j + 1]]
  11. ans = 0
  12. for i in range(m):
  13. for j in range(n):
  14. if grid[i][j] == '1':
  15. ans += 1
  16. bfs(i, j)
  17. return ans
  • 时间复杂度:深度优先搜索 DFS - 图3
  • 空间复杂度:深度优先搜索 DFS - 图4

695. Max Area of Island

  1. class Solution:
  2. def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
  3. def dfs(i, j):
  4. if not 0 <= i < m or not 0 <= j < n or grid[i][j] == 0:
  5. return 0
  6. grid[i][j] = 0
  7. return 1 + dfs(i-1, j) + dfs(i+1, j) + dfs(i, j-1) + dfs(i, j+1)
  8. m, n = len(grid), len(grid[0])
  9. max_area = 0
  10. for i in range(m):
  11. for j in range(n):
  12. if grid[i][j] == 1:
  13. max_area = max(max_area, dfs(i, j))
  14. return max_area
  • 时间复杂度:深度优先搜索 DFS - 图5
  • 空间复杂度:深度优先搜索 DFS - 图6 ?
class Solution:
    def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
        m, n = len(grid), len(grid[0])
        max_area = 0

        for i in range(m):
            for j in range(n):
                if grid[i][j] == 1:
                    area = 1
                    grid[i][j] = 0
                    queue = collections.deque([(i, j)])
                    while queue:
                        r, c = queue.popleft()
                        for u, v in [r-1, c], [r+1, c], [r, c-1], [r, c+1]:
                            if 0 <= u < m and 0 <= v < n and grid[u][v] == 1:
                                area += 1
                                grid[u][v] = 0
                                queue.append((u, v))

                    max_area = max(max_area, area)

        return max_area