Leetcode面试经典150题刷题记录 —— 图篇

Leetcode面试经典150题刷题记录 —— 图篇

    • 1. 岛屿数量
    • 2. 被围绕的区域
    • 5. 课程表

1. 岛屿数量

题目链接:岛屿数量 - leetcode
题目描述:
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。
题目归纳:
深搜或广搜。

解题思路:
解法: 岛屿数量 - leetcode官方题解

class Solution:
    # 即dfs,采用了直观命名法
    def sinking_island_into_the_sea(self, grid, i, j):
        grid[i][j] = 0  # 不是用visited矩阵,而是直接置0
        m = len(grid)
        n = len(grid[0])
        direction = [[1, 0], [-1, 0], [0, 1], [0, -1]]
        for d in range(len(direction)): # direction的4个方向
            next_i = i + direction[d][0]
            next_j = j + direction[d][1]
            if 0<= next_i and next_i < m and 0<= next_j and next_j < n and grid[next_i][next_j] == "1":
                self.sinking_island_into_the_sea(grid, next_i, next_j)


    def numIslands(self, grid: List[List[str]]) -> int:
        # (1)矩阵维度
        m = len(grid)
        if m == 0:
            return 0
        n = len(grid[0])

        num = 0
        for i in range(m):  # 行
            for j in range(n):  # 列
                if grid[i][j] == "1":
                    num += 1
                    self.sinking_island_into_the_sea(
                        grid, i, j
                    )  # 将该岛屿沉没入海,不再参与后续计数
        return num

2. 被围绕的区域

题目链接:被围绕的区域 - leetcode
题目描述:
给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。
题目归纳:
这道题也是在考察围棋知识,围棋里的断气就是被包围,但是这里有个例外,就是边界上的棋子不会被填充,那么解题思路为:从边界上的O出发,将与边界相连的O标记为A,最后再分两步遍历board
(1)所有为O的都标记为X
(2)所有为A的再标记为O

解题思路:
解法: 被围绕的区域 - leetcode官方题解

# 这道题也是在考察围棋知识,围棋里的断气就是被包围,但是这里有个例外,就是边界上的棋子不会被填充,那么解题思路为
# 从边界上的O出发,将与边界相连的O标记为A
# 最后分两步遍历board
# (1)所有为O的都标记为X
# (2)所有为A的再标记为O
class Solution:
    def solve(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        def dfs(x, y):
            if not 0 <= x < n or not 0 <= y < m or board[x][y] != 'O':
                return
            
            board[x][y] = "A"
            dfs(x + 1, y)
            dfs(x - 1, y)
            dfs(x, y + 1)
            dfs(x, y - 1)

        # 解题逻辑
        if not board:
            return
        
        n, m = len(board), len(board[0])

        for i in range(n):
            dfs(i, 0)       # left
            dfs(i, m - 1)   # right
        
        for i in range(m - 1):
            dfs(0, i)       # top
            dfs(n - 1, i)   # bottom
        
        for i in range(n):
            for j in range(m):
                if board[i][j] == "A":
                    board[i][j] = "O"
                elif board[i][j] == "O":
                    board[i][j] = "X"

5. 课程表

题目链接:课程表 - leetcode
题目描述:
你这个学期必须选修 numCourses 门课程,记为 0numCourses - 1 。在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false
题目归纳:

解题思路:
解法: 课程表 - leetcode官方题解

参考文章或视频链接
[1] 【简单、快速地带你了解图论以及拓扑排序!】

你可能感兴趣的:(Algorithm,面试技术栈,leetcode,面试,linux)