• 题目要求:

image.png
image.png

  • 思路:

    • 遍历数组,每当遇见一块陆地,把统计的陆地数量加一,并把这块陆地所有的1都变为0
  • 核心代码:
res = 0
cur = []
# 遍历数组
for i in range(len(grid)):
    for j in range(len(grid[0])):
        # 如果当前为陆地,把当前陆地变为0
        if grid[i][j] == '1':
            # 注意是字符串
            grid[i][j] = '0'
            # 把当前陆地的坐标加入到cur当中,因为要把这块陆地所有相邻的1都找到并变为0
            cur.append((i,j))
            while cur:
                # 取到这个点的下标
                cur_i, cur_j = cur.pop(0)
                # 找它的上下左右
                for x, y in [(1,0),(0,1),(-1,0),(0,-1)]:
                    tmp_i = cur_i + x
                    tmp_j = cur_j + y
                    # 如果上下左右没有越界
                    if tmp_i >= 0 and tmp_i < len(grid) and tmp_j >= 0 and tmp_j < len(grid[0]):
                        # 并且上下左右有是陆地的情况
                        if grid[tmp_i][tmp_j] == '1':
                            # 把陆地变为0,并把这个陆地的下标加入到cur数组中,一会查看这个陆地周围是否还有陆地
                            grid[tmp_i][tmp_j] = '0'
                            cur.append((tmp_i,tmp_j))
            # 把统计的岛屿数量加一
            res += 1               
return res
  • 完整代码:
class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:
        res = 0
        cur = []
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if grid[i][j] == '1':
                    grid[i][j] = '0'
                    cur.append((i,j))
                    while cur:
                        cur_i, cur_j = cur.pop(0)
                        for x, y in [(1,0),(0,1),(-1,0),(0,-1)]:
                            tmp_i = cur_i + x
                            tmp_j = cur_j + y
                            if tmp_i >= 0 and tmp_i < len(grid) and tmp_j >= 0 and tmp_j < len(grid[0]):
                                if grid[tmp_i][tmp_j] == '1':
                                    grid[tmp_i][tmp_j] = '0'
                                    cur.append((tmp_i,tmp_j))     
                    res += 1               
        return res

Adrianna
1 声望2 粉丝