每天一道算法练习题--Day22&& 第一章 --算法专题 --- ----------小岛问题

LeetCode 上有很多小岛题,虽然官方没有这个标签, 但是在我这里都差不多。不管是思路还是套路都比较类似,大家可以结合起来练习。

不严谨地讲,小岛问题是 DFS 的子专题。

套路

这种题目的套路都是 DFS,从一个或多个入口 DFS 即可。 DFS 的时候,我们往四个方向延伸即可。

一个最经典的代码模板:

seen = set()
def dfs(i, j):
	  if i 越界 or j 越界: return
	  if (i, j) in seen: return
	  temp = board[i][j]
	  # 标记为访问过
	  seen.add((i, j))
	  # 上
	  dfs(i + 1, j)
	  # 下
	  dfs(i - 1, j)
	  # 右
	  dfs(i, j + 1)
	  # 左
	  dfs(i, j - 1)
	  # 撤销标记
	  seen.remove((i, j))
# 单点搜索
dfs(0, 0)
# 多点搜索
for i in range(M):
   for j in range(N):
      dfs(i, j)

有时候我们甚至可以不用 visited 来标记每个 cell 的访问情况, 而是直接原地标记,这种算法的空间复杂度会更好。这也是一个很常用的技巧, 大家要熟练掌握。

def dfs(i, j):
	  if i 越界 or j 越界: return
	  if board[i][j] == -1: return
	  temp = board[i][j]
	  # 标记为访问过
	  board[i][j] = -1
	  # 上
	  dfs(i + 1, j)
	  # 下
	  dfs(i - 1, j)
	  # 右
	  dfs(i, j + 1)
	  # 左
	  dfs(i, j - 1)
	  # 撤销标记
	  board[i][j] = temp
# 单点搜索
dfs(0, 0)
# 多点搜索
for i in range(M):
   for j in range(N):
      dfs(i, j)

相关题目

在这里插入图片描述
上面四道题都可以使用常规的 DFS 来做。 并且递归的方向都是上下左右四个方向。更有意思的是,都可以采用原地修改的方式,来减少开辟 visited 的空间。

其中 463 题, 只是在做 DFS 的时候,需要注意相邻的各自边长可能会被重复计算, 因此需要减去。这里我的思路是:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值