算法思想-深度搜索算法-leetcode相关题目总结
- 通过这篇文章你能学到什么
- 搜索算法
- 深度优先搜索
- 分析过程
- 实现代码
- 进出栈过程示意图
- 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相关题目总结相关推荐
- 已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)
1.文字描述: 已知一颗二叉树的前序(后序)遍历序列和中序遍历序列,如何构建这棵二叉树? 以前序为例子: 前序遍历序列:ABCDEF 中序遍历序列:CBDAEF 前序遍历先访问根节点,因此前序遍历序列 ...
- 深度学习前沿算法思想
转自: 深度学习前沿算法思想 导读 第一版: 深度学习前沿算法思想 深度学习实践:使用Tensorflow实现快速风格迁移 行为识别:让机器学会"察言观色"第一步 第二版: 谷歌首 ...
- (转)深度学习前沿算法思想
深度学习前沿算法思想 本文转自: https://mp.weixin.qq.com/s?__biz=MzA5NDExMTAzNA==&mid=2649981646&idx=2& ...
- [Leetcode][分治法]相关题目汇总/分析/总结
题目汇总 以下链接均为我博客内对应博文,有解题思路和代码,不定时更新补充. 目前范围:Leetcode前150题 分治法相关题目 两个排序数组的中位数 请找出这两个有序数组的中位数.要求算法的时间复杂 ...
- 算法思想 - 搜索算法
本文主要介绍算法中搜索算法的思想,主要包含BFS,DFS. 搜索相关题目 深度优先搜索和广度优先搜索广泛运用于树和图中,但是它们的应用远远不止如此. BFS 广度优先搜索的搜索过程有点像一层一层地进行 ...
- 深度增强学习前沿算法思想
作者: Flood Sung,CSDN博主,人工智能方向研究生,专注于深度学习,增强学习与机器人的研究. 责编:何永灿,欢迎人工智能领域技术投稿.约稿.给文章纠错,请发送邮件至heyc@csdn.n ...
- 【Leetcode之算法思想】
Leetcode只算法思想 学习CS-Notes的leetcode 提示:小小记录...~ 文章目录 Leetcode只算法思想 一.双指针 最长序列 二.排序 数组中出现频率最高的k个数 按照字符出 ...
- Leetcode中二叉树中的搜索相关题目解析以及java实现
Leetcode中二叉树中的搜索相关题目解析以及java实现 这一类的题目其实稍微有一些杂,基本就是在二叉树中寻找一些或者某个特定值,题目比较多,我们会通过两道三篇来总结,不过总体来说也基本上就是BF ...
- LeetCode刷题笔记(算法思想 四)
LeetCode刷题笔记(算法思想 四) 七.动态规划 斐波那契数列 70. 爬楼梯 198. 打家劫舍 213. 打家劫舍 II 信件错排 母牛生产 矩阵路径 64. 最小路径和 62. 不同路径 ...
最新文章
- 以太坊源码分析之随心笔记
- gcc mips64编译后无法运行在octeon上运行_编译工具链
- 中如何直接使用方法返回的值_java基础-2-方法、面向对象
- linux系统创建windows启动盘
- php 检测domain信息
- 暨南大学研究生招生信息网计算机学院,暨南大学研究生院招生信息网
- python json操作_Python读取JSON数据操作实例解析
- 计算机网络教程 azw3,Windows 10从入门到精通(pdf+epub+mobi+txt+azw3)
- Modebus - usb转RS485(芯片)串口驱动
- linux 启动禁用显卡驱动,Linux secure boot(安全启动)时添加Nvidia显卡驱动
- java.io.IOException: Unable to read entire header; 275 bytes read; expected 512 bytes
- 羽毛球高远球技术动作要领解码
- 数据库之Mac下Mysql命令全集
- java汉字转拼音和获取汉语拼音首字母
- 计算机毕业设计(附源码)python众筹平台
- [万字]java后端研发岗秋招常见面经总结
- Java面向对象总结
- iOS客户端图片智能裁剪
- 关于docker报错:No connection could be made because the target machine actively refused it.
- 为什么要写博客,写博客有什么意义
热门文章
- CS231n (winter 2016) : Assignment1
- git pull(拉取) push(上传)详解
- Matlab数形结合求解不等式
- 解读Bytom丨比原链BTM,连接两个世界的无限可能
- [论文解读]A Quantitative Analysis Framework for Recurrent Neural Network
- Git服务器搭建简明教程
- 罗技压枪脚本教学(二)
- ASP.NET CORE MVC使用SCD(独立部署)发布
- 搭建 公网FTP服务器 外网访问
- java学习笔记第七周(二)