• 通过这篇文章你能学到什么
  • 搜索算法
  • 深度优先搜索
  • 分析过程
  • 实现代码
  • 进出栈过程示意图
  • DFS算法应用-Leetcode相关题目
    • Leetcode 78 Subsets
    • Leetcode 90 Subsets II
    • Leetcode 47 Permutations II
    • Leetcode 131 Palindrome Partitioning
  • 答案
  • 关注微信公众号

通过这篇文章,你能学到什么

通过这篇文章,我们可以进一步体会到深度优先搜索算法在具体问题中的应用,通过详细地示意图,深刻明白递归调用时的进栈,出栈过程;最后通过Leetcode相似解法的题目进一步加深对深度搜索算法的理解。

搜索算法

搜索算法,常见的几种形式,深度优先,广度优先,二分搜索,应用搜索算法的前提是求解空间是有限的,然后在这个空间中找出满足题意的解。有些问题如果能用二分搜索,那是最高效的,因为每次都会使求解空间减掉一半。

深度优先搜索

Depth first search algorithm,它是首先沿着深度方向搜索,然后再在广度方向搜索的。例如,要求某个序列的全排列,就可以用深度优先搜索。

某个序列的全排序算法题目
The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the permutations in order, We get the following sequence (ie, for n = 3):

“123” “132” “213” “231” “312” “321”

分析过程

如何写出深度优先搜索的代码呢?
首先我们拿出元素1,然后在1,2,3 这个深度方向寻找,找到满足题意的解有两个,1,2,3,和1,3,2;
然后再在广度方向上搜索,此时的元素为2,再在1,2,3 深度方向上搜索,得到满足题意的解,2,1,3和2,3,1,
最后,在广度方向上搜索到3,再在1,2,3 深度方向上搜索,满足题意的解为 3,1,2 和 3,2,1。

实现代码

public class Solution{public IList<IList<int>> GetPermutation(int n){IList<IList<int>> rslt = new List<IList<int>>();dfs(rslt, new List<int>(),1,n);return rslt;}// start 是dfs中的一个变量private void dfs(IList<IList<int>> rslt, List<int> curItem, int start,int digits){//找到一个解if (curItem.Count == digits) {rslt.Add(new List<int>(curItem));return;}//广度方向搜索for (int i = 1; i <= digits; i++) {//跳过重复元素if (curItem.Contains(i))continue;curItem.Add(i);//深度方向上的递归dfs(rslt, curItem, i,digits); //后进的元素优先出栈curItem.RemoveAt(curItem.Count - 1); }}}

进出栈过程示意图

看下 dfs 在广度和深度方向递归进、出栈过程,广度方向首先到1,然后搜索发生在深度方向,1,2,3 的 dfs 依次入栈,出栈顺序依次为 3,2,1,1,如下图所示,

然后再在广度方向上搜索【补充,可以看出深度优先搜索在前,广度方向上搜索在后,所以叫做 DFS】,此时 广度方向 for 遍历到 i = 2,然后再在深度方向搜索,出栈顺序依次为 3,2,1,2,如下图所示,

同理,广度方向搜索到 i=3,然后再在深度方向搜索,出栈顺序依次为 3,2,1,3,如下图所示,

dfs 终止。

DFS算法应用-Leetcode相关题目

Leetcode 78. Subsets

Given a set of distinct integers, nums, return all possible subsets.

Note: The solution set must not contain duplicate subsets.

For example,
If nums = [1,2,3], a solution is:

[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]


Leetcode 90. Subsets II

Given a collection of integers that might contain duplicates, nums, return all possible subsets.

Note: The solution set must not contain duplicate subsets.

For example,
If nums = [1,2,2], a solution is:

[ [2], [1], [1,2,2], [2,2], [1,2], [] ]


Leetcode 47. Permutations II

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

For example,
[1,1,2] have the following unique permutations:

[ [1,1,2], [1,2,1], [2,1,1] ]


Leetcode 131. Palindrome Partitioning

Given a string s, partition s such that every substring of the partition is a palindrome.

Return all possible palindrome partitioning of s.

For example, given s = “aab”,
Return

[ [“aa”,”b”], [“a”,”a”,”b”] ]


看看 Leetcode 上这些应用了 DFS 的题目,这些题目与 讲解的那道题思路非常相似,灵活运用的这个思考过程还是很重要的,仔细体会下吧。

答案

http://blog.csdn.net/column/details/14761.html

关注微信公众号

更多相关算法文章,敬请关注以下公众号,共同交流。

算法思想-深度搜索算法-leetcode相关题目总结相关推荐

  1. 已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)

    1.文字描述: 已知一颗二叉树的前序(后序)遍历序列和中序遍历序列,如何构建这棵二叉树? 以前序为例子: 前序遍历序列:ABCDEF 中序遍历序列:CBDAEF 前序遍历先访问根节点,因此前序遍历序列 ...

  2. 深度学习前沿算法思想

    转自: 深度学习前沿算法思想 导读 第一版: 深度学习前沿算法思想 深度学习实践:使用Tensorflow实现快速风格迁移 行为识别:让机器学会"察言观色"第一步 第二版: 谷歌首 ...

  3. (转)深度学习前沿算法思想

    深度学习前沿算法思想 本文转自: https://mp.weixin.qq.com/s?__biz=MzA5NDExMTAzNA==&mid=2649981646&idx=2& ...

  4. [Leetcode][分治法]相关题目汇总/分析/总结

    题目汇总 以下链接均为我博客内对应博文,有解题思路和代码,不定时更新补充. 目前范围:Leetcode前150题 分治法相关题目 两个排序数组的中位数 请找出这两个有序数组的中位数.要求算法的时间复杂 ...

  5. 算法思想 - 搜索算法

    本文主要介绍算法中搜索算法的思想,主要包含BFS,DFS. 搜索相关题目 深度优先搜索和广度优先搜索广泛运用于树和图中,但是它们的应用远远不止如此. BFS 广度优先搜索的搜索过程有点像一层一层地进行 ...

  6. 深度增强学习前沿算法思想

    作者: Flood Sung,CSDN博主,人工智能方向研究生,专注于深度学习,增强学习与机器人的研究.  责编:何永灿,欢迎人工智能领域技术投稿.约稿.给文章纠错,请发送邮件至heyc@csdn.n ...

  7. 【Leetcode之算法思想】

    Leetcode只算法思想 学习CS-Notes的leetcode 提示:小小记录...~ 文章目录 Leetcode只算法思想 一.双指针 最长序列 二.排序 数组中出现频率最高的k个数 按照字符出 ...

  8. Leetcode中二叉树中的搜索相关题目解析以及java实现

    Leetcode中二叉树中的搜索相关题目解析以及java实现 这一类的题目其实稍微有一些杂,基本就是在二叉树中寻找一些或者某个特定值,题目比较多,我们会通过两道三篇来总结,不过总体来说也基本上就是BF ...

  9. LeetCode刷题笔记(算法思想 四)

    LeetCode刷题笔记(算法思想 四) 七.动态规划 斐波那契数列 70. 爬楼梯 198. 打家劫舍 213. 打家劫舍 II 信件错排 母牛生产 矩阵路径 64. 最小路径和 62. 不同路径 ...

最新文章

  1. 以太坊源码分析之随心笔记
  2. gcc mips64编译后无法运行在octeon上运行_编译工具链
  3. 中如何直接使用方法返回的值_java基础-2-方法、面向对象
  4. linux系统创建windows启动盘
  5. php 检测domain信息
  6. 暨南大学研究生招生信息网计算机学院,暨南大学研究生院招生信息网
  7. python json操作_Python读取JSON数据操作实例解析
  8. 计算机网络教程 azw3,Windows 10从入门到精通(pdf+epub+mobi+txt+azw3)
  9. Modebus - usb转RS485(芯片)串口驱动
  10. linux 启动禁用显卡驱动,Linux secure boot(安全启动)时添加Nvidia显卡驱动
  11. java.io.IOException: Unable to read entire header; 275 bytes read; expected 512 bytes
  12. 羽毛球高远球技术动作要领解码
  13. 数据库之Mac下Mysql命令全集
  14. java汉字转拼音和获取汉语拼音首字母
  15. 计算机毕业设计(附源码)python众筹平台
  16. [万字]java后端研发岗秋招常见面经总结
  17. Java面向对象总结
  18. iOS客户端图片智能裁剪
  19. 关于docker报错:No connection could be made because the target machine actively refused it.
  20. 为什么要写博客,写博客有什么意义

热门文章

  1. CS231n (winter 2016) : Assignment1
  2. git pull(拉取) push(上传)详解
  3. Matlab数形结合求解不等式
  4. 解读Bytom丨比原链BTM,连接两个世界的无限可能
  5. [论文解读]A Quantitative Analysis Framework for Recurrent Neural Network
  6. Git服务器搭建简明教程
  7. 罗技压枪脚本教学(二)
  8. ASP.NET CORE MVC使用SCD(独立部署)发布
  9. 搭建 公网FTP服务器 外网访问
  10. java学习笔记第七周(二)