面试编程题解题思路(二)

0x01 深度优先搜索

题目描述:

面试编程题解题思路(二)_第1张图片

这种题解题思路在于将连接在一起的‘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 二叉树的遍历

题目:

面试编程题解题思路(二)_第2张图片

主要考察对于二叉树的遍历方法。

采用一直遍历右子树的方式,在遍历的同时记录遍历的深度并返回。

随后遍历左子树,只要深度不大于右子树就不添加,大于后添加。

代码如下:

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)]

 

你可能感兴趣的:(面试编程题)