方法
1.深度搜索
2.广度搜索
3.回溯
4.数据收集叶子节点路径:每个节点计数:深度/次数
题型
岛屿问题主函数遍历所有数组元素,找岛屿个数深度/广度搜索函数负责把岛屿跑满(visited[i]==True)岛屿边界控制
图搜索深度/广度搜索
797. 所有可能的路径
class Solution:def __init__(self):self.res = []# self.path = [0]def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:path = [0]# l = set()self.tracebacking( graph, 0, path)return self.resdef tracebacking(self, graph, node, path):if(node == len(graph)-1):self.res.append(path[:])# print(self.res)returnfor index, node in enumerate(graph[node]):path.append(node)self.tracebacking( graph, node, path)path.pop()
200. 岛屿数量
class Solution:def __init__(self):self.dir = [[0,1],# right[1,0],#down[-1,0],#up[0,-1]]#leftdef numIslands(self, grid: List[List[str]]) -> int:m = len(grid) #hangn = len(grid[0])#lieprint(m, n)visited = [[False]*n for _ in range(m)]result = 0for i in range(m):for j in range(n):# print( grid[i][j] == 1))if visited[i][j] == False and grid[i][j] == "1":self.dfs(grid, visited, i, j)#self.bfs(grid, visited, i, j)result += 1# print(visited)return resultdef dfs(self, grid, visited, x, y):if grid[x][y] == "0" or visited[x][y] == True:returnvisited[x][y] = Truefor i in range(4):nextx = x + self.dir[i][0]nexty = y + self.dir[i][1]if nextx<0 or nextx>=len(grid) or nexty<0 or nexty>=len(grid[0]):continueself.dfs(grid, visited, nextx, nexty)def bfs(self, grid, visited, x, y):q = deque()q.append((x, y))visited[x][y] = Truewhile q:x, y = q.popleft()# print(x,y)for i in range(4):nextx = x + self.dir[i][0]nexty = y + self.dir[i][1]if nextx<0 or nextx>=len(grid) or nexty<0 or nexty>=len(grid[0]) or visited[nextx][nexty] == True or grid[nextx][nexty] == "0":continuevisited[nextx][nexty] = Trueq.append((nextx, nexty))
695. 岛屿的最大面积
对岛屿数量进行修改就可以了
区别在于最大面积计算递归次数(dfs),或者入栈次数(bfs)
class Solution:def __init__(self):self.dir = [[0,1],# right[1,0],#down[-1,0],#up[0,-1]]#leftself.maxsize = 0self.count = 0def maxAreaOfIsland(self, grid: List[List[int]]) -> int:m = len(grid) #hangn = len(grid[0])#lie# print(m, n)visited = [[False]*n for _ in range(m)]for i in range(m):for j in range(n):if visited[i][j] == False and grid[i][j] == 1:#bfs# self.maxsize = max(self.maxsize, self.bfs(grid, visited, i, j))#dfsself.count = 0self.dfs(grid, visited, i, j)self.maxsize = max(self.maxsize, self.count)return self.maxsize# def bfs(self, grid, visited, x, y):# q = deque()# q.append((x, y))# visited[x][y] = True# maxtem = 1# while q:# x, y = q.popleft()# for i in range(4):# nextx = x + self.dir[i][0]# nexty = y + self.dir[i][1]# if nextx<0 or nextx>=len(grid) or nexty<0 or nexty>=len(grid[0]) or visited[nextx][nexty] == True or grid[nextx][nexty] == 0:# continue# visited[nextx][nexty] = True# maxtem += 1# q.append((nextx, nexty))# return maxtemdef dfs(self, grid, visited, x, y):if grid[x][y] == 0 or visited[x][y] == True:return 0visited[x][y] = Trueself.count += 1for i in range(4):nextx = x + self.dir[i][0]nexty = y + self.dir[i][1]if nextx<0 or nextx>=len(grid) or nexty<0 or nexty>=len(grid[0]):continueself.dfs(grid, visited, nextx, nexty)