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
门课程,记为0
到numCourses - 1
。在选修某些课程之前需要一些先修课程。 先修课程按数组prerequisites
给出,其中prerequisites[i] = [ai, bi]
,表示如果要学习课程ai
则 必须 先学习课程bi
。例如,先修课程对[0, 1]
表示:想要学习课程0
,你需要先完成课程1
。请你判断是否可能完成所有课程的学习?如果可以,返回true
;否则,返回false
。
题目归纳:
解题思路:
解法: 课程表 - leetcode官方题解
参考文章或视频链接 |
---|
[1] 【简单、快速地带你了解图论以及拓扑排序!】 |