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

DFS深度优先搜索:核心原理+模板+力扣例题

DFS 深度优先搜索+力扣例题+模版

DFS 核心思想:一条路走到黑,碰壁就回溯,再走其他分支

文章目录

  • DFS 深度优先搜索+力扣例题+模版
    • 一、DFS 基础概念
      • 1. 原理
      • 2. 关键要点
      • 3. 常见应用场景
      • 4. DFS vs BFS 速记
    • 二、经典例题(Java 实现)
      • 例题 1:LeetCode 547 省份数量(图连通性)
      • 例题 2:LeetCode 112 路径总和(二叉树 DFS)
    • 三、DFS 通用模板(Java 递归版)
    • 四、常见坑点
    • 五、总结

一、DFS 基础概念

1. 原理

从起点出发,优先往深处走,直到走不通再回退到上一个岔路口,换方向继续搜索。

2. 关键要点

  • 访问标记:图必须用,防止重复遍历死循环
  • 回溯:状态用完要恢复(组合、排列等问题必备)
  • 本质:利用递归 / 栈实现

3. 常见应用场景

  • 岛屿数量、连通分量、省份数量
  • 二叉树遍历、路径搜索
  • 组合、排列、子集等回溯问题
  • 迷宫搜索、拓扑排序

4. DFS vs BFS 速记

特性DFSBFS
数据结构队列
遍历方式纵向深入逐层扩散
擅长问题连通性、回溯最短路径

二、经典例题(Java 实现)

例题 1:LeetCode 547 省份数量(图连通性)

题目:二维数组表示城市连接关系,求有多少个连通省份。

classSolution{publicintfindCircleNum(int[][]isConnected){intn=isConnected.length;boolean[]visited=newboolean[n];intcount=0;for(inti=0;i<n;i++){if(!visited[i]){dfs(isConnected,visited,i);count++;}}returncount;}privatevoiddfs(int[][]isConnected,boolean[]visited,inti){visited[i]=true;for(intj=0;j<isConnected.length;j++){if(isConnected[i][j]==1&&!visited[j]){dfs(isConnected,visited,j);}}}}

例题 2:LeetCode 112 路径总和(二叉树 DFS)

题目:判断是否存在 根→叶子 路径,节点和等于目标值。

classSolution{publicbooleanhasPathSum(TreeNoderoot,inttargetSum){if(root==null)returnfalse;// 到达叶子节点if(root.left==null&&root.right==null){returntargetSum==root.val;}returnhasPathSum(root.left,targetSum-root.val)||hasPathSum(root.right,targetSum-root.val);}}// 树节点定义classTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(){}TreeNode(intval){this.val=val;}TreeNode(intval,TreeNodeleft,TreeNoderight){this.val=val;this.left=left;this.right=right;}}

三、DFS 通用模板(Java 递归版)

// 通用 DFS 模板voiddfs(当前节点,状态/标记,其他参数){// 1. 终止条件if(满足边界/已访问/找到目标){记录结果;return;}// 2. 标记当前节点visited[当前]=true;// 3. 遍历所有方向/子节点for(下一个节点:可选方向){if(合法&&未访问){dfs(下一个节点,状态,参数);}}// 4. 回溯(需要时才写)visited[当前]=false;}

四、常见坑点

  1. 图遍历必须加 visited,否则死循环
  2. 回溯题一定要恢复状态
  3. 深度过大会栈溢出,可改用迭代栈实现

五、总结

DFS 就是“递归走到底 + 回退换分支”,记住模板 + 两道例题,绝大多数搜索题都能套用。

http://www.jsqmd.com/news/514773/

相关文章:

  • Hyper-v 中windows虚机 里面部署Open Claw要点
  • VS Code搭建STM32嵌入式开发环境(GCC+OpenOCD+Makefile)
  • CY8CMBR3102电容式土壤湿度传感器Arduino驱动详解
  • STM32F4 USB主机库:轻量级HID与MSC设备支持
  • VASSAL开源桌游引擎:构建数字化桌游体验的全方位解决方案
  • GME-Qwen2-VL-2B-Instruct参数详解:图像预处理(resize/crop/normalize)对匹配影响
  • 5个步骤掌握开放词汇目标检测:零基础玩转GroundingDINO实践指南
  • DAMOYOLO-S跨平台推理效果演示:Windows与Linux对比
  • 文墨共鸣5分钟上手:StructBERT水墨风语义分析零基础教程
  • AudioSeal实操手册:使用curl命令行调用AudioSeal API完成自动化流水线
  • # Qwen3.5在Transformers库部署推理及ReAct智能体
  • SiameseUIE与Anaconda环境集成:Python开发最佳实践
  • 经典平面手性光学仿真:COMSOL模拟中的能带、Q因子与琼斯矩阵透射谱研究,偏振场分布与磁场分...
  • 效率直接起飞!风靡全网的AI论文软件 —— 千笔·专业学术智能体
  • OpenClaw备份自动化:ollama-QwQ-32B智能分类+压缩上传方案
  • 将Granite时间序列预测能力封装为智能体(Agent)的决策模块
  • MGeo模型原理详解:多模态预训练如何建模‘地图坐标’与‘文本描述’
  • 2026年桌面高清壁纸AI设计工具实操评测:多模型生成与二次编辑提升交付效率
  • 2026年工业干燥设备优质推荐榜:双干燥机厂家/圆盘干燥机/带式干燥机/桨叶干燥机/流化床干燥机/滚筒干燥机/真空干燥机/选择指南 - 优质品牌商家
  • Go语言基础之基本数据类型
  • AARONIA SPECTRAN V6 PLUS 2000XA-6
  • SenseVoice-Small模型微信小程序开发实战:实现录音即时转文字功能
  • 从金庸到漫威:用LangChain+Embedding模型分析武侠与超级英雄语义相似度
  • 技术深度解析:Win11Debloat的架构设计与系统优化原理
  • 烟花爆竹仓库嵌入式环境监测终端设计
  • 【瑞利衰落信道】从Clarke到Jakes:模型对比与仿真实践
  • 从入门到精通:快速排序的核心原理、实现与优化
  • 电池管理(BMS)控制系统 电动客车电池管理系统SOC估算单元设计 设计一款电池管理系统,它包...
  • STM32 USB虚拟串口(VCP)原理与HAL库实战
  • 构建社区照护桥梁:.NET Core3.1+MVC社区呼叫系统设计与实现