当前位置: 首页 > article >正文

005 深度优先搜索(DFS)算法详解:图解+代码+经典例题

📌 什么是深度优先搜索?

深度优先搜索(Depth-First Search,DFS)是算法竞赛和面试中最高频的暴力搜索算法之一。其核心思想是“一条路走到黑”,从起点出发,优先探索最深的节点,直到无路可走再回溯,属于回溯算法的基石。


🌳 DFS算法思想

1. 核心流程(二叉树举例)

         A/   \B     C/ \   /D  E  FDFS遍历顺序:A → B → D → E → C → F
  • 递归本质:系统调用栈实现“先进后出”
  • 回溯条件:遇到叶子节点或访问完所有子节点后回退

2. DFS与BFS对比

特性DFSBFS
数据结构栈(递归/显式栈)队列
空间复杂度O(h)(h为树高度)O(w)(w为树宽度)
适用场景路径问题、连通块最短路径、层级遍历

🛠️ DFS实现方式

1. 递归模板(最常用)

def dfs(node, visited):if node in visited:  # 终止条件returnvisited.add(node)    # 标记已访问# 处理当前节点逻辑for neighbor in node.neighbors:  # 遍历子节点dfs(neighbor, visited)

2. 显式栈模板(避免递归溢出)

def dfs_stack(start):stack = [start]visited = set()while stack:node = stack.pop()if node not in visited:visited.add(node)# 处理当前节点for neighbor in reversed(node.neighbors):  # 保证顺序stack.append(neighbor)

🔥 DFS六大经典应用场景

1. 路径查找问题

  • 例题:113. 路径总和 II
  • 代码片段
def pathSum(root, target):res = []def dfs(node, path, sum_val):if not node: returnsum_val += node.valpath.append(node.val)if not node.left and not node.right and sum_val == target:res.append(path.copy())dfs(node.left, path, sum_val)dfs(node.right, path, sum_val)path.pop()  # 关键回溯dfs(root, [], 0)return res

2. 连通块计数

  • 例题:200. 岛屿数量
  • 技巧:沉岛法(访问过的陆地标记为’0’)

3. 排列组合问题

  • 例题:46. 全排列
  • 关键:维护used数组记录已选元素

4. 拓扑排序

  • 例题:207. 课程表
  • 重点:检测图中是否存在环

5. 棋盘类问题

  • 例题:51. N 皇后
  • 优化:对角线剪枝(row-colrow+col标识)

6. 记忆化DFS

  • 例题:329. 矩阵中的最长递增路径
  • 核心:用memo数组避免重复计算

⚠️ DFS高频易错点

  1. 忘记回溯

    path.append(node.val)  # 前进
    dfs(...)
    path.pop()            # 必须回溯!
    
  2. 未剪枝导致超时
    通过排序+条件判断跳过无效分支(例:40. 组合总和 II)

  3. 递归终止条件错误
    需明确递归到叶子节点或越界时的处理方式

  4. 修改全局变量未恢复
    在修改全局状态(如矩阵元素)后,必须在回溯时还原


🚀 DFS优化技巧

1. 剪枝策略

  • 可行性剪枝:提前排除不可能的解
    (例:17. 电话号码的字母组合中跳过空输入)

  • 最优性剪枝:当前路径已劣于已知最优解时终止
    (例:剑指 Offer 34. 二叉树中和为某一值的路径)

2. 方向向量简化代码

# 四方向遍历
directions = [(-1,0), (1,0), (0,-1), (0,1)]
for dx, dy in directions:x_new, y_new = x + dx, y + dy

3. 双向DFS

  • 适用场景:目标明确的搜索问题(如127. 单词接龙)
  • 优势:将时间复杂度从O(bd)降为O(b(d/2)),b为分支因子,d为深度

💡 学习建议

  1. 先理解再背模板:通过二叉树遍历掌握递归流程
  2. 从二维矩阵入手:岛屿类问题适合培养空间思维
  3. Debug技巧
    • 打印递归树层级
    • 使用可视化工具(如Python Tutor)
  4. 延伸学习
    • 回溯算法(DFS+剪枝)
    • 迭代加深搜索(IDDFS)
    • A*算法(启发式搜索)

📚 精选LeetCode练习题

题目难度核心考点
79. 单词搜索中等二维矩阵回溯
494. 目标和中等组合问题变形
473. 火柴拼正方形中等剪枝优化
980. 不同路径 III困难状态压缩

掌握DFS的关键在于大量练习总结回溯模式。建议每天刷2-3题,坚持两周即可显著提升对DFS的掌控力!

相关文章:

005 深度优先搜索(DFS)算法详解:图解+代码+经典例题

📌 什么是深度优先搜索? 深度优先搜索(Depth-First Search,DFS)是算法竞赛和面试中最高频的暴力搜索算法之一。其核心思想是“一条路走到黑”,从起点出发,优先探索最深的节点,直到无…...

maven快速上手

之前我们项目如果要用到其他额外的jar包,需要自己去官网下载并且导入。但是有maven后,直接在maven的pom.xml文件里用代码配置即可,配置好后maven会自动帮我们联网下载并且会自动导入该jar包 在右边的maven中,我们可以看到下载安装…...

cplex12.9 安装教程以及下载

cplex 感觉不是很好找,尤其是教育版,我这里提供一个版本,在下面的图可以看到,不仅可以配置matlab,也可以配置vs,现在拿vs2017来测试一下,具体文件的文件有需要的可以复制下面的链接获取 我用网盘分享了「c…...

甘特图实例 dhtmlxGantt.js

本文介绍了如何使用dhtmlxGantt库创建一个基础的甘特图示例,并对其进行汉化和自定义配置。首先,通过引入dhtmlxgantt.css和dhtmlxgantt.js文件初始化甘特图。接着,通过设置gantt.i18n.setLocale("cn")实现核心文本的汉化&#xff0…...

AMD硬件笔试面试题型解析

本专栏预计更新60期左右。当前第12期 这个系列通过在各类网上搜索大厂公开的笔试和面试题目,然后构造相关的知识点矩阵,让大家对核心的知识点有更深的认识,这个过程虽然耗时费力,但大厂的很多题目确实非常巧妙,很有代表性。由于官方没有发布过这样的题库,所以文章中的题目…...

视频剪辑 VEGAS - 配置视频片段保持原长宽比

VEGAS 配置视频片段保持原长宽比 右击视频片段 -> 选择【开关】 -> 勾选【保持长宽比】 右击视频片段 -> 点击【属性】 -> 弹出【属性】窗口 点击【媒体】 -> 选择【像素宽高比】为【1,0000(方形)】...

力扣 54 .螺旋矩阵

文章目录 题目介绍题解 题目介绍 题解 代码如下&#xff1a; class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> res new ArrayList<>();if (matrix.length 0){return res;}int l 0, r matrix[0].length - 1, t 0, b…...

四、【API 开发篇 (上)】:使用 Django REST Framework 构建项目与模块 CRUD API

【API 开发篇 】&#xff1a;使用 Django REST Framework 构建项目与模块 CRUD API 前言为什么选择 Django REST Framework (DRF)&#xff1f;第一步&#xff1a;创建 Serializers (序列化器)第二步&#xff1a;创建 ViewSets (视图集)第三步&#xff1a;配置 URLs (路由)第四步…...

python使用pycharm和conda 设置默认使用清华镜像

将步骤分为Conda配置和PyCharm配置两部分。Conda部分包括添加镜像源、调整优先级、更新环境。PyCharm部分需要根据版本说明如何添加镜像源到项目解释器设置中。同时&#xff0c;需要验证配置是否成功&#xff0c;并提醒常见问题&#xff0c;比如路径错误或缓存问题。需要确保引…...

Prometheus+Grafana实现对服务的监控

PrometheusGrafana实现对服务的监控 前言&#xff1a;PrometheusGrafana实现监控会更加全面&#xff0c;监控的组件更多 Prometheus官网 https://prometheus.io/docs/prometheus/latest/getting_started/ Grafana官网 https://grafana.com/docs/ 一、安装PrometheusGrafana 这…...

ARM笔记-ARM伪指令及编程基础

第四章 ARM伪指令及编程基础 4.1 伪指令概述 4.1.1 伪指令定义 人们设计了一些专门用于指导汇编器进行汇编工作的指令&#xff0c;由于这些指令不形成机器码指令&#xff0c;它们只是在汇编器进行汇编工作的过程中起作用&#xff0c;所以被叫做伪指令。 4.1.2 伪指令特征 …...

Python入门手册:Python基础语法

Python是一种简洁、易读且功能强大的编程语言&#xff0c;非常适合初学者入门。无论你是编程新手&#xff0c;还是有一定编程基础但想学习Python的开发者&#xff0c;掌握Python的基础语法都是迈向高效编程的第一步。本文将详细介绍Python的基本语法&#xff0c;包括变量和数据…...

SpringBoot-SpringBoot源码解读

SpringBoot-SpringBoot源码解读 一、Spring Boot启动过程概述 Spring Boot通过一系列的类和机制&#xff0c;简化了Spring应用的启动流程。当你执行SpringApplication.run()时&#xff0c;Spring Boot会自动完成应用的初始化、环境配置、组件加载、自动配置等任务&#xff0c…...

CAD如何导出PDF?PDF如何转CAD?详细教程来了

浩辰CAD看图王是一款功能强大的CAD图纸查看与编辑工具&#xff0c;其核心功能之一便是支持CAD与PDF格式的互转。下面是CAD看图王输出PDF和PDF转CAD功能的详细介绍及操作步骤&#xff1a; 一、输出PDF功能 看图王可以将CAD图纸转换为PDF格式&#xff0c;是文件在不同的设备上显…...

python-数据可视化(大数据、数据分析、可视化图像、HTML页面)

通过 Python 读取 XLS 、CSV文件中的数据&#xff0c;对数据进行处理&#xff0c;然后生成包含柱状图、扇形图和折线图的 HTML 报告。这个方案使用了 pandas 处理数据&#xff0c;matplotlib 生成图表&#xff0c;并将图表嵌入到 HTML 页面中。 1.XSL文件生成可视化图像、生成h…...

el-select中自定义 两组el-option,但是key不一样,并且点击需获取当前整个项的所有属性

当el-select中只有一组el-option &#xff0c; 获取点击的当前项的属性 &#xff0c; el-select 绑定:value-keyid 但是 当el-select中有两组el-option ,每组option的key不一致,如下代码所示 <el-selectv-model"sth" change"choosee":value-key"…...

【笔记】OpenCV的学习(未完)

由于只记关键和不懂的部分 希望做到下次再看这部分笔记就记得 所以用词会非常简练 前向传播 输入数据依次经过模型的各层&#xff0c;按照各层定义的运算规则进行计算&#xff0c;最终得到模型预测输出的过程。 单向的信息流动&#xff0c;不涉及模型参数的更新。 助于思考的…...

多模态大语言模型arxiv论文略读(八十七)

MG-LLaVA: Towards Multi-Granularity Visual Instruction Tuning ➡️ 论文标题&#xff1a;MG-LLaVA: Towards Multi-Granularity Visual Instruction Tuning ➡️ 论文作者&#xff1a;Xiangyu Zhao, Xiangtai Li, Haodong Duan, Haian Huang, Yining Li, Kai Chen, Hua Ya…...

《棒球百科》长寿运动排名·棒球1号位

关于长寿运动的排名&#xff0c;运动长寿秘诀&#xff1a; 一、全球公认的「长寿运动」排名 游泳&#xff08;低冲击、强化心肺&#xff09; 快走/健走&#xff08;每日30分钟降低15%早逝风险&#xff09; 太极拳&#xff08;平衡力减压&#xff0c;哈佛研究称可延缓衰老&am…...

Maven 项目打包时添加本地 Jar 包

在 Maven 项目开发中&#xff0c;我们经常会遇到需要引入本地 Jar 包的场景&#xff0c;比如使用未发布到中央仓库的第三方库、公司内部自定义工具包&#xff0c;或者处理版本冲突的依赖项。本文将详细介绍如何通过 Maven 命令将本地 Jar 包安装到本地仓库&#xff0c;并在项目…...

记录将网站从http升级https

http与https 你知道http是什么吗&#xff0c;那你知道https吗&#xff1f;在进行升级之前我们应该都听说http不安全&#xff0c;要用https&#xff0c;那你知道这是为什么吗&#xff1f; 什么是http&#xff1f; HTTP 是超文本传输协议&#xff0c;也就是HyperText Transfer…...

如何利用 ORM 框架有效防范 SQL 注入攻击

如何利用 ORM 框架有效防范 SQL 注入攻击 1. 引言 在现代 Web 开发中,SQL 注入攻击始终是数据库安全的一大隐患。攻击者利用不安全的 SQL 语句执行恶意操作,可能导致数据库泄露、篡改甚至被完全控制。幸运的是,ORM(对象关系映射)框架为开发者提供了一种更安全、更高效的…...

spark-shuffle 类型及其对比

1. Hash Shuffle 原理&#xff1a;将数据按照分区键进行哈希计算&#xff0c;将相同哈希值的数据发送到同一个Reducer中。特点&#xff1a;实现简单&#xff0c;适用于数据分布均匀的场景。但在数据分布不均匀时&#xff0c;容易导致某些Reducer处理的数据量过大&#xff0c;产…...

免费PDF工具-PDF24V9.16.0【win7专用版】

【百度】https://pan.baidu.com/s/1H7kvHudG5JTfxHg-eu2grA?pwd8euh 提取码: 8euh 【夸克】https://pan.quark.cn/s/92080b2e1f4c 【123】https://www.123912.com/s/0yvtTd-XAHjv https://creator.pdf24.org/listVersions.php...

游戏开发实战(二):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】

文章目录 奇美拉和队列奇美拉被动技能多对多观察者关系实现自定义元类奇美拉基类 管理奇美拉的队列奇美拉队列类心得体会扩展 规则定义工作相关奇美拉相关 奇美拉属性 在本篇博文&#xff0c;我将介绍本项目的整体框架&#xff0c;以及“编码规则”&#xff0c;这些规则保证了本…...

人工智能发展

探秘人工智能领域的热门编程语言与关键知识 在当今科技飞速发展的时代&#xff0c;人工智能已渗透到生活的各个角落&#xff0c;从智能语音助手到精准的推荐系统&#xff0c;从自动驾驶汽车到医疗影像诊断&#xff0c;人工智能正以前所未有的速度改变着世界。而在这背后&#x…...

在Rockchip平台上利用FFmpeg实现硬件解码与缩放并导出Python接口

在Rockchip平台上利用FFmpeg实现硬件解码与缩放并导出Python接口 一、为什么需要硬件加速?二、[RK3588 Opencv-ffmpeg-rkmpp-rkrga编译与测试](https://hi20240217.blog.csdn.net/article/details/148177158)三、核心代码解释3.1 初始化硬件上下文3.2 配置解码器3.3 构建滤镜链…...

Flink集成资源管理器

Flink集成资源管理器 Apache Flink 支持多种资源管理器&#xff0c;主要包括以下几种‌&#xff1a; YARN ResourceManager ‌&#xff1a;适用于使用 Hadoop YARN 作为资源管理器的环境。YARN ResourceManager 负责管理集群中的资源&#xff0c;包括 CPU、内存等&#xff0c;并…...

一周学会Pandas2 Python数据处理与分析-Pandas2数据合并与对比-pd.concat():轴向拼接

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在数据分析中&#xff0c;数据往往分散在多个来源&#xff08;如不同文件、数据库表或API&#xff09;&#xff0c;需…...

安卓原生兼容服务器

安卓原生兼容服务器的定义 安卓原生兼容服务器‌指基于Android系统内核和服务框架构建的服务器环境&#xff0c;能够在不依赖第三方适配层的情况下&#xff0c;直接运行符合Android API规范的服务程序&#xff0c;并满足与其他软硬件组件的协同工作需求。其核心特征体现在以下…...