数据结构与算法——深度优先搜索算法

news/2024/12/17 15:28:29/

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、代码模板
  • 二、题目案例
  • 总结


前言

本文所述的深度优先搜索算法主要针对树状结构,其中的树的每个节点都可以包含0到多个子节点。
深度优先,即为先纵向搜索树的枝干,搜索到该枝干的叶子节点后返回,再搜索另一条枝干(横向搜索),从而在纵向和横向上实现对整个树形结构的全遍历。


一、代码模板

深度优先搜索算法,有人也将其成为回溯法,即优先搜索值树的叶子节点,然后递归调用返回(即为回溯),接着搜索同层的下一个节点。

结论:递归调用进入树的下一层节点,for循环遍历同层内的下一个节点

void depthFirstSearch(arg...) {if (结束递归判定) {// 一些处理return;}// may be need somethingfor (i=开始搜索 ; i < 结束条件; 处理i) { // 搜索本层的节点// 前处理,处理该节点,比如push_backdepthFirstSearch(arg...); // 递归调用,搜索下一层// 下一层搜索完毕后函数返回,进行后处理,比如pop_back}
}

二、题目案例

77.组合

class Solution {vector<vector<int>> res;void backtracking(int n, int k, int idx, vector<int>& proper){if (proper.size() == k) {res.push_back(proper);    return;}for (int i = idx; i <= n - (k-proper.size()) + 1; ++i){proper.push_back(i);backtracking(n, k, i+1, proper);proper.pop_back();}}
public:vector<vector<int>> combine(int n, int k) {vector<int> proper;backtracking(n, k, 1, proper);return res;}
};

在这里插入图片描述

40. 组合总和 II

class Solution {vector<vector<int>> res;void backtracking(vector<int>& candidates, int target, int sum, int idx, vector<int>& node){if (sum == target){res.push_back(node);return;}int prev = 51;for (int i=idx; i < candidates.size() && sum < target; ++i){// if (i>0 && (candidates[i-1] == candidates[i]) ) continue;if (prev == candidates[i]){continue;}prev = candidates[i];node.push_back(candidates[i]);backtracking(candidates, target, sum + candidates[i], i+1, node);node.pop_back();}}
public:vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {sort(candidates.begin(), candidates.end());vector<int> node;backtracking(candidates, target, 0, 0, node);return res;}
};

在这里插入图片描述


总结


http://www.ppmy.cn/news/1555888.html

相关文章

(笔记)lib:no such lib的另一种错误可能:/etc/ld.so.conf没增加

[TOC]((笔记)lib:no such lib的另一种错误可能&#xff1a;/etc/ld.so.conf没增加) 0.需求说明 通过cmakelist去find一个库时&#xff0c;可能导致报错&#xff0c;例如”libsgm.so cannot open“。但明明已经make install了&#xff0c;所以还有一种可能&#xff1a; 共享库…

JAVA学习日记(二十六)网络编程

一、网络编程的概念 常见的软件架构&#xff1a; 二、网络编程三要素 IP&#xff1a;设备在网络中的地址&#xff0c;是唯一的标识 端口号&#xff1a;应用程序在设备中的唯一标识 协议&#xff1a;数据在网络中传输的规则&#xff0c;常见的协议有UDP、TCP、http、https、f…

ES常用API以及Java使用RestClient操作ES教程

ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过http请求发送给ES。官方文档地址&#xff1a; Elasticsearch Clients | Elastic。由于ES目前最新版本是8.16&#xff0c;提供了全新版本的客户端&#xff0c;老版本的…

【Unity基础】AudioSource 常用方法总结

在 Unity 中&#xff0c;AudioSource 组件用于控制音频的播放和管理。以下是常用的 AudioSource 控制方法及其说明。 1. 播放和暂停音频 Play()&#xff1a;开始播放音频&#xff0c;如果是从暂停的地方继续播放&#xff0c;可以直接调用。Pause()&#xff1a;暂停当前播放的…

HIK 相机 设置缓存节点进行取流

场景&#xff1a;【硬触发】环境触发频率快时&#xff0c;相机内缓存图片&#xff08;默认节点数量为1&#xff09;有可能被不停刷新&#xff0c;导致无法及时捕捉到每次触发响应的图片。 方案&#xff1a;SDK中可以设置相机内部缓冲节点数量和取图策略。 nRet MV_CC_SetImag…

水表的数字表盘分割数据集labelme格式3023张13类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;3023 标注数量(json文件个数)&#xff1a;3023 标注类别数&#xff1a;13 标注类别名称:["readbox_1","center",&q…

哈尔滨工业大学《2024年801自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《哈尔滨工业大学801自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2024年真题 Part1&#xff1a;2024年完整版真题 2024年真题