0x01 深度优先搜索
题目描述:
这种题解题思路在于将连接在一起的‘1’看作是一个整体,可以将二维数组看成是无向图,每个‘1’之间都连接着一条线
从头到尾对数组进行遍历,碰到‘1’就进行深度搜索,将搜索到的‘1’全部变为‘0’, 这样发起深度搜索的次数就是岛屿的数量
代码如下:
class Solution(object):
def numIslands(self, grid):
"""
:type grid: List[List[str]]
:rtype: int
"""
def dfs(grid, i, j):
grid[i][j] == 0
for x, y in [(i-1, j), (i+1, j), (i, j-1), (i, j+1)]:
if 0 <= x < len(grid) and 0 <= y < len(grid[0]) and grid[x][y] == '1':
grid[x][y] =0
dfs(grid, x, y)
n_r = len(grid)
if n_r == 0:
return 0
n_l = len(grid[0])
island_num = 0
for i in range(n_r):
for j in range(n_l):
if grid[i][j] == '1':
island_num += 1
dfs(grid, i, j)
return island_num
0x02 二叉树的遍历
题目:
主要考察对于二叉树的遍历方法。
采用一直遍历右子树的方式,在遍历的同时记录遍历的深度并返回。
随后遍历左子树,只要深度不大于右子树就不添加,大于后添加。
代码如下:
def rightSideView(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
rightmost_value_at_depth = dict() # 深度为索引,存放节点的值
max_depth = -1
stack = [(root, 0)]
while stack:
node, depth = stack.pop()
if node is not None:
# 维护二叉树的最大深度
max_depth = max(max_depth, depth)
# 如果不存在对应深度的节点我们才插入
rightmost_value_at_depth.setdefault(depth, node.val)
stack.append((node.left, depth+1))
stack.append((node.right, depth+1))
return [rightmost_value_at_depth[depth] for depth in range(max_depth+1)]