Leecode DFS深度优先搜索
定义
图解
深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法。它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念。
网格类问题的 DFS 遍历方法
网格问题的基本概念
我们首先明确一下岛屿问题中的网格结构是如何定义的,以方便我们后面的讨论。
网格问题是由 m * n 个小方格组成一个网格,每个小方格与其上下左右四个方格认为是相邻的,要在这样的网格上进行某种搜索。
岛屿问题是一类典型的网格问题。每个格子中的数字可能是 0 或者 1。我们把数字为 0 的格子看成海洋格子,数字为 1 的格子看成陆地格子,这样相邻的陆地格子就连接成一个岛屿。
在这样一个设定下,就出现了各种岛屿问题的变种,包括岛屿的数量、面积、周长等。不过这些问题,基本都可以用 DFS 遍历来解决。
994. 腐烂的橘子
"""
1、首先分别将腐烂的橘子和新鲜的橘子保存在两个集合中;
2、模拟广度优先搜索的过程,方法是判断在每个腐烂橘子的四个方向上是否有新鲜橘子,如果有就腐烂它。每腐烂一次时间加 +1,并剔除新鲜集合里腐烂的橘子;
3、当橘子全部腐烂时结束循环。
"""
# 整洁版
class Solution:def orangesRotting(self, grid):row = len(grid)col = len(grid[0])rotten = {(i, j) for i in range(row) for j in range(col) if grid[i][j] == 2} # 腐烂集合fresh = {(i, j) for i in range(row) for j in range(col) if grid[i][j] == 1} # 新鲜集合time = 0while fresh:if not rotten: return -1rotten = {(i + di, j + dj) for i, j in rotten for di, dj in [(0, 1), (0, -1), (1, 0), (-1, 0)] if(i + di, j + dj) in fresh} # 即将腐烂的如果在新鲜的集合中,就将它腐烂fresh -= rotten # 剔除腐烂的time += 1return time# 描述版
class Solution:def orangesRotting(self, grid):# 腐烂橘子集合、新鲜橘子集合fresh, rotten = set(), set()n, m = len(grid), len(grid[0])for i in range(n):for j in range(m):if grid[i][j] == 2:rotten.add((i, j))elif grid[i][j] == 1:fresh.add((i, j))time = 0directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]# 遍历腐烂橘子集合,向各个方位腐烂新鲜的橘子 while fresh:if not rotten:return -1# 即将腐烂的如果在新鲜的集合中,就将它腐烂temp_rotten = set()for i, j in directions:for di, dj in rotten:if (di + i, dj + j) in fresh:temp_rotten.add((di + i, dj + j))rotten = temp_rotten# 将新鲜的橘子腐烂fresh -= temp_rottentime += 1return time
463. 岛屿的周长
给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。
示例 1:
输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
输出:16
解释:它的周长是上面图片中的 16 个黄色的边
class Solution:def islandPerimeter(self, grid):n, m = len(grid), len(grid[0])directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]ans = 0for i in range(n):for j in range(m):if grid[i][j] != 1:continueans += 4for di, dj in directions:temp_i = di + itemp_j = dj + j# 判断新的坐标有没有越界,并且是否又相连的区域;if all([temp_i >= 0, temp_i <= n - 1, temp_j >= 0, temp_j <= m - 1, grid[temp_i][temp_j] == 1]):ans -= 1return ans
130. 被围绕的区域
给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。
示例 1:
输入:board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]]
输出:[["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]]
"""1、获取网格的边界2、遍历边界,把相连的并且为O的位置进行转换为*3、还原,把*转换为O,其他的转换为#
"""class Solution:def solve(self, board):def dfs(i, j):if board[i][j] == "O":board[i][j] = "*"for di, dj in directions:tempi, tempj = di + i, dj + j# 判断边界if tempi >= 0 and tempi <= n - 1 and tempj >= 0 and tempj <= m - 1:dfs(tempi, tempj)n, m = len(board), len(board[0])directions = [(1, 0), (-1, 0), (0, 1), (0, -1)]# 获取边界,由边界向里面寻找res = set()for j in range(m):dfs(0, j)dfs(n - 1, j)for i in range(n):dfs(i, 0)dfs(i, m - 1)for i in range(n):for j in range(m):board[i][j] = "O" if board[i][j] == "*" else "X"
695. 岛屿的最大面积
给你一个大小为 m x n 的二进制矩阵 grid 。
岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。
岛屿的面积是岛上值为 1 的单元格的数目。
计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。
"""
思路和上一题一样,不过本次需要递归统计每次查找的数量。
"""
class Solution:def maxAreaOfIsland(self, grid: List[List[int]]) -> int:def dfs(i, j):# 判断边界if not (i >= 0 and i <= n - 1 and j >= 0 and j <= m - 1 and grid[i][j] == 1):return 0num, grid[i][j] = 1, 0for di, dj in [(1, 0), (-1, 0), (0, 1), (0, -1)]:tempi, tempj = di + i, dj + jnum += dfs(tempi, tempj)return numn, m, ans = len(grid), len(grid[0]), 0for i in range(n):for j in range(m):if grid[i][j] == 1:ans = max(ans, dfs(i, j))return ans
Leecode DFS深度优先搜索相关推荐
- 图:DFS(深度优先搜索)图解分析代码实现
文章目录 一.简介 二.图的建立 2.1建立图类 2.2建立图 三.DFS 3.1图解 3.2代码 一.简介 图的DFS(深度优先搜索)与BFS(广度优先搜索)是图的两种遍历方式. 主要区别在于当到达 ...
- DFS——深度优先搜索基础
[0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 review DFS--深度优先搜索 的基础知识: [1]深度优先搜索的应用 1.1)深度优先搜索算法描述(转自 ...
- 【算法】蓝桥杯dfs深度优先搜索之排列组合总结
[导航] 上一篇文章 → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结> 为了重申感谢之意,再次声明下文的大部分灵感均来自于[CSDN]梅森上校<JAVA版本:DFS算法题解两 ...
- dfs深度优先搜索_图的深度优先搜索(DFS)
dfs深度优先搜索 Depth First Search (DFS) is an algorithm that searches a graph/tree, in a depth-wise manne ...
- 【蓝桥杯C/C++】专题五:DFS深度优先搜索
专题五:DFS深度优先搜索 目录 专题五:DFS深度优先搜索 前言 什么是回溯法 如何理解回溯法 回溯法解决的问题 回溯法模板 1 .回溯函数模板返回值以及参数 2. 回溯函数终止条件 3 .回溯搜索 ...
- DFS(深度优先搜索)算法实现
2 DFS算法 DFS(深度优先搜索)算法,搜索过程是类似于不撞南墙不回头的意思,DFS一般使用堆栈(先入后出)这种数据结构实现,由此一来,以初始起点为中心进行搜索,首先是周围点加入到堆栈中,起始点搜 ...
- “暴力美学1”——DFS深度优先搜索
作为新时代青年,"暴力"二字似乎离我们十分遥远,大多数时候我们只能够在电影或者电视剧上接触这个概念 暴力二字或许是个贬义词,但若是我们在后面加上美学二字,或许就是一个值得推敲的词汇 ...
- 张三踩瓷砖:C++用DFS深度优先搜索解POJ1979 Red and Black问题
POJ1979 Red and Black 题目链接: POJ1979 Red and Black 简单理解一下题目: 张三站在一个长方形的房间里,房间里铺满了方形瓷砖,瓷砖有红色和黑色两种,他站在其 ...
- 【算法】蓝桥杯dfs深度优先搜索之图连通总结
前言 上两篇文章 → <[算法]蓝桥杯dfs深度优先搜索之排列组合总结> → <[算法]蓝桥杯dfs深度优先搜索之凑算式总结> 为了重申感谢之意,第三次声明下文的 ...
最新文章
- BF算法优化-------KMP算法
- java oralce merge_mybatis 使用oracle merge into 语句踩坑实录(示例代码)
- Python 常用 PEP8 编码规范和建议
- 岩板铺地好吗_威廉顿岩板1200x2700x9mm,上墙铺地非常好看大气
- flask读取数据库(mysql)并展示表格(讲解获取表头的方法)【附上flask好看点的helloworld】
- 开始 Sencha Touch 2 之旅之三
- Linxu服务器文件双向同步 rsync+sersync 详细讲解
- 炒菜机器人放食材的顺序_如果给你个做饭机器人,你会让它做些什么饭菜?
- 15年3月c语言试卷,2015年3月计算机二级C语言试卷及答案..doc
- Projecting Your View Attentively: Monocular Road Scene Layout Estimation via Cross-view Transformati
- Python实现excel重复值计数/记录小白第一次学习
- docker - 安装searx搜索引擎
- 使用极光推送发送短信验证码
- Python中以字母r/R,或字母u/U 开头的字符串
- 基于Android+Python Flask框架实现的智慧记单词APP设计
- 计算机内存4G,笔记本电脑4g内存和8g内存的区别
- Oracle的dual是什么东西啊
- python中finally是什么意思_什么是pythontry-finally语句?它能起到什么样的作用?
- IEEE Access录用了一篇文章,目前在web of science中还检索不到,请问童鞋们该肿么办?
- python气象绘图速成_Python气象绘图Day-By-Day
热门文章
- 【linux技术】记一次虚拟机vmware里 Centos7开机故障:sd 0:0:0:0: [sda] Assuming drive cache: write through
- Drcom校园网认证系列(一) 抓包
- Python语言特色集锦
- MATLAB统计分析—描述性统计
- PCB:Beyond Part Models: Person Retrieval with Refined Part Pooling(论文阅读笔记)
- 看MySQL数据库的观后感,【看点·光】谈谈赏析和读后感(随笔)_mysql执行语句...
- STP的安全特性详解与环路保护机制
- 做个很小众的应用就可以月入数万,为什么多数程序员都不做个人开发?
- Qt无边框窗体实现方案
- 国产手机会使用鸿蒙,小米等国产手机会使用鸿蒙系统吗?