搜索与回溯是计算机竞赛中常用的算法,当很多问题无法通过计算法则来求解时,便可以利用搜索和回溯的技术来求解。
回溯是搜索算法中的一种控制策略,它的基本思想是:为了求得问题的解,先选择一种可能的情况向前探索,如果在探索过程中发现原来的选择是错误的,就退回一步重新选择,如此反复进行,直到穷举出所有情况,可以证明该问题无解。

我相信很多人小时候都玩过“走迷宫”这样一个游戏:进入迷宫后,先随意选择一个可以走的地方前进,如果碰到死路,则说明前方无路可走,这时,如果周围还有没有路可以走,就继续选择一条路前进,否则就往后退一步,再看看周围有没有路可走……如此反复进行下去直到到达出口或退回起点为止。而走迷宫的这个过程,便是一个搜索与回溯。

如图所示,以深度优先的方式进行遍历,假设起点是1,访问顺序为1 -> 2 -> 4,由于结点4没有未访问的相邻结点,所以这里需要回溯到2,然后发现2还有未访问的相邻结点5,于是继续访问2 -> 5 -> 6 -> 3 -> 7,这时候7回溯到3,3回溯到6,6回溯到5,5回溯到2,最后2回溯到起点1,1已经没有未访问的结点了,搜索终止,图中圆圈代表路点,红色箭头表示搜索路径,蓝色虚线表示回溯路径。


电话号码的字母组合-回溯法

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例:

输入:“23”
输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].

class Solution {public List<String> letterCombinations(String digits) {List<String> combinations = new ArrayList<String>();if (digits.length() == 0) {return combinations;}Map<Character, String> phoneMap = new HashMap<Character, String>() {{put('2', "abc");put('3', "def");put('4', "ghi");put('5', "jkl");put('6', "mno");put('7', "pqrs");put('8', "tuv");put('9', "wxyz");}};backtrack(combinations, phoneMap, digits, 0, new StringBuffer());return combinations;}public void backtrack(List<String> combinations, Map<Character, String> phoneMap, String digits, int index, StringBuffer combination) {if (index == digits.length()) {combinations.add(combination.toString());} else {char digit = digits.charAt(index);String letters = phoneMap.get(digit);int lettersCount = letters.length();for (int i = 0; i < lettersCount; i++) {combination.append(letters.charAt(i));backtrack(combinations, phoneMap, digits, index + 1, combination);combination.deleteCharAt(index);}}}
}

路径总和-深度优先

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

说明: 叶子节点是指没有子节点的节点。

示例:
给定如下二叉树,以及目标和 sum = 22,

          5/ \4   8/   / \11  13  4/  \      \7    2      1

返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
public class Solution {public boolean hasPathSum(TreeNode root, int sum) {if(root == null){return false;}if(root.left == null && root.right == null){return root.val == sum;}return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val);}
}

回溯算法与深度优先算法相关推荐

  1. 算法迷宫 深度优先算法

    1.1关于随机迷宫生成的问题 随机迷宫生成是算法中一个典型的例子,生成一个庞大且复杂的迷宫,人们进去以后很难走出来.一般来说,利用二维数组存储一个矩形迷宫,利用广度优先算法.深度优先算法.以及随机普里 ...

  2. 浅谈网络爬虫中广度优先算法和深度优先算法

    前言 做爬虫的,最怕业务简单粗暴的来一句"爬一下XXXX网".比如,"爬一下央广网"(示例链接:http://www.cnr.cn),看着密密麻麻的各种子分类, ...

  3. 广度优先算法和深度优先算法-树形结构(层级结构)-Java

    广度优先算法和深度优先算法-树形结构(层级结构)-Java 目录 文章目录 1.前言 2.递归 3.栈+深度优先算法 4.队列+广度优先算法 5.比较 ***后记*** : 内容 1.前言 在日常应用 ...

  4. BFS广度优先算法, DFS深度优先算法,Python,队列实现,栈实现

    来源:https://www.bilibili.com/video/BV1Ks411575U/?spm_id_from=333.788.videocard.0 BFS广度优先算法 graph = {& ...

  5. 十五数码难题 A*算法及深度优先算法实现

    一.问题描述 二.算法分析 在搜索的每一步都利用估价函数 f(n)= g(n)+h(n)对 Open 表中的节点进行排序表中的节点进行排序, 找出一个最有希望的节点作为下一次扩展的节点.且满足条 件: ...

  6. python 广度优先算法和深度优先算法遍历的实现

    用这个图为例子 用字典存储这个图 graph = {'A':['C','B'],'B':['A','C','D'],'C':['A','B','E','D'],'D':['B','C','E','F' ...

  7. 数据结构算法_深度优先算法例题(带简易流程图)

    万能的搜索_解救小青 #include <stdio.h> int n, m, p, q, min = 99999999; int a[51][51], book[51][51];void ...

  8. 利用广度优先和深度优先算法解决迷宫问题【算法设计与分析】<图搜索问题>

    实验问题: 给定一个n*n的迷宫,要求利用广度优先和深度优先算法解决迷宫问题 问题分析: 对于此问题首先要明确搜索顺序 可以分为两种方法求解问题:1.广度优先算法2.深度优先算法 (1)对于深度优先算 ...

  9. 算法之深度优先、广度优先算法

    目录 前言: 搜索算法: 广度优先搜索算法 深度优先搜索算法 问题:如何找出社交网络中某个用户的三度好友关系? 总结: 参考资料: 前言: 图这种数据结构经常用于表示一个社交网络,在社交网络中有一个六 ...

最新文章

  1. nodejs系列-翻译http
  2. 第十二周项目4-点、圆的关系
  3. Linux学习总结(七十)docker-2
  4. JVM内存结构与GC
  5. 高校实验室管理系统_实验室信息管理系统(LIMS)全解
  6. php 怎么实现收藏功能,php收藏功能如何实现
  7. C语言课后习题(62)
  8. hashmap put复杂度_集合类HashMap,HashTable,ConcurrentHashMap区别?
  9. OSGI开发web应用
  10. QPushButton的四个信号:pressed(),clicked(),released(),toggled()
  11. 计算机应用基础公开课,计算机应用基础-公开课教案.doc
  12. 深入理解原型和原型链
  13. OpenCms创建网站过程图解
  14. 你知道百度的全景街景地图是怎么做的吗?
  15. C#练习题答案: 卡塔劳尔【难度:1级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战
  16. 生成PayPal测试账号clientID 和 密钥
  17. easypoi导入图片_EasyPOI—导出Excel图片问题
  18. php5.6安装zendopcache加速
  19. 纯css实现手风琴效果_创建纯CSS手风琴的4种方法
  20. 【算法】全排列的四种思路

热门文章

  1. [似水流年]夏夜微风忆以往伴蝉鸣
  2. 一、《无限法则》雪地逃杀模式
  3. html文本过长自动换行,css 长文本及长链接自动换行的几种方法
  4. 互联网公司利用云闪付可以做什么?
  5. linux进程文件描述符 vnode,Linux C编程详解:进程原理分析、文件描述符和文件记录表、文件句柄和文件原理...
  6. centos安装pip工具
  7. iPhone修个运营商图标
  8. 电信,移动,联通黑名单用户是什么意思
  9. 【Office】Word 删除最后一页空白页
  10. UE4 微笔记 之 调整网格材质参数