最近有在leetcode上面做算法题,已经遇到了两道回溯算法的题目,感觉一点思路都没有,现决定将java如何实现回溯算法做一次总结。

什么叫做回溯算法

(摘抄于百度百科)

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。

(摘抄于他人博客)

在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。 若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。 而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。

如何使用回溯算法

回溯我认为也就是一种递归,有以下四个参数,当然不一定是我所举例的类型,要看题目而定

一个全局变量集合保存所有满足条件的答案,举例:List list

一个集合保存一个满足条件的答案,举例:ListtempList

算法问题给所给的输入条件,这个可能是一个字符串,也可能是一个数组

附加参数(可有可无,视题目而定)

举例

import java.util.ArrayList;

import java.util.List;

public class Permutations {

//题目描述:Given a collection of distinct integers, return all possible permutations.(给定一组不同的整数,返回其所有的可能组合)

public List> permute(int[] nums) {

//一个全局变量,用于保存所有集合

List> list = new ArrayList<>();

//传入三个参数,没有附加参数

backtrack(list, new ArrayList<>(), nums);

return list;

}

private void backtrack(List> list, List tempList, int [] nums){

//一个终结条件,也就是满足条件的时候

if(tempList.size() == nums.length){

//全局变量添加一个满足条件的集合

list.add(new ArrayList<>(tempList));

} else{

for(int i = 0; i < nums.length; i++){

if(tempList.contains(nums[i])) continue;

//如果tempList没有包含nums[i]才添加

tempList.add(nums[i]);

//递归调用,此时的tempList一直在变化,直到满足终结条件才结束

backtrack(list, tempList, nums);

System.out.println("tempList的内容:"+tempList+"-------"+"i的值:"+i);

//它移除tempList最后一个元素的作用就是返回上一次调用时的数据,也就是希望返回之前的节点再去重新搜索满足条件。这样才能实现回溯

tempList.remove(tempList.size() - 1);

}

}

}

public static void main(String[] args){

int[] nums={1,2,3};

(new Permutations()).permute(nums);

}

}

main方法测试,输出语句的结果显示如下,可以观察出回溯的过程

tempList的内容:[1, 2, 3]-------i的值:2

tempList的内容:[1, 2]-------i的值:1

tempList的内容:[1, 3, 2]-------i的值:1

tempList的内容:[1, 3]-------i的值:2

tempList的内容:[1]-------i的值:0

tempList的内容:[2, 1, 3]-------i的值:2

tempList的内容:[2, 1]-------i的值:0

tempList的内容:[2, 3, 1]-------i的值:0

tempList的内容:[2, 3]-------i的值:2

tempList的内容:[2]-------i的值:1

tempList的内容:[3, 1, 2]-------i的值:1

tempList的内容:[3, 1]-------i的值:0

tempList的内容:[3, 2, 1]-------i的值:0

tempList的内容:[3, 2]-------i的值:1

tempList的内容:[3]-------i的值:2

我对这道题目的理解是从这个for循环的i=0开始就不断递归,然后在不断消除集合最末尾元素进行回溯,直到回溯完成。这样就产生了首位元素是1的各种情况。以此类推,之后再开始for循环i=1,产生首位元素是2的各种情况。

形象点就是一个根结点有1,2,3三个元素,第一次从1出发,寻找最低端满足条件的结点,然后再返回上一个结点寻找满足条件的结点,直到返回1,返回1之后再从2开始,以此类推。

java回溯算法_java实现回溯算法相关推荐

  1. java gc回收算法_Java GC回收算法-判定一个对象是否可以回收

    开源推荐 推荐一款一站式性能监控工具(开源项目) Pepper-Metrics是跟一位同事一起开发的开源组件,主要功能是通过比较轻量的方式与常用开源组件(jedis/mybatis/motan/dub ...

  2. 6种java垃圾回收算法_Java垃圾回收算法

    主要根据以下3篇博客做的整理 http://blog.csdn.net/zsuguangh/article/details/6429592 http://www.cnblogs.com/ywl925/ ...

  3. 垃圾回收算法_Java 垃圾回收算法与几种垃圾回收器

    一.如何确定某个对象是"垃圾"? 目前主流垃圾回收器都采用的是可达性分析算法来判断对象是否已经存活,不使用引用计数算法判断对象时候存活的原因在于该算法很难解决相互引用的问题.如何确 ...

  4. java数据结构 队列_Java数据结构与算法[原创]——队列

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...

  5. java常用算法_JAVA编程常用算法——冒泡排序

    一.冒泡排序算法运作的过程 (1)比较相邻的元素.如果第一个比第二个大,就交换他们两个. (2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. (3 ...

  6. java 性能 排序_Java常用排序算法及性能测试集合

    package algorithm.sort; import java.lang.reflect.Method; import java.util.Arrays; import java.util.D ...

  7. java setlt;intgt;_java使用Nagao算法实现新词发现、热门词的挖掘

    采用Nagao算法统计各个子字符串的频次,然后基于这些频次统计每个字符串的词频.左右邻个数.左右熵.交互信息(内部凝聚度). 名词解释: Nagao算法:一种快速的统计文本里所有子字符串频次的算法.详 ...

  8. java密码学原型算法_java密码学原型算法实现——双线性对.pdf

    java密码学原型算法实现--双线性对 Java 密码学原型算法实现--双线性对 1.背景介绍 如何使用jPBC 库进行双线性群初始化,包括: (1)质数阶双线性群(Prime-Order Bilin ...

  9. java遍历字符串_Java后端开发算法基础面试题分享,你离大厂也许就差这份面试题

    一.算法基础 1. 重建二叉树 题目: 输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树. 注意: 二叉树中每个节点的值都互不相同: 输入的前序遍历和中序遍历一定合法: 演示: 给定: 前序遍历 ...

最新文章

  1. C# 批处理制作静默安装程序包
  2. 当AD服务器置于防火墙内时,所需开放的端口
  3. 一步一步SharePoint 2007系列文章目录
  4. 企业网络推广—面对企业网络推广需求如何体现企业产品或服务价值
  5. CentOS Linux解决Device eth0 does not seem to be present 但是没有发现eth1
  6. javaee实验报告心得_准大四学生七月青软实训总结
  7. seo技巧-2015/10/05
  8. IOS基础基于pod上手体验FMDB框架
  9. hmi开发软件c语言,组态,HMI,软件,VC++,源代码
  10. 网络推手团队_辛8工作室,被列入经营异常名单!工作室发声明解释!二子爷喊话辛8:你能强大过马云吗?达少太忙没有时间玩!团队断水断粮式野外生存!...
  11. mac修改eclipse的内存配置
  12. OppoR17被查找手机锁死问题解锁
  13. java monitor怎么使用_Java monitor机制使用方法解析
  14. Unity3D相机限制移动范围
  15. java数组不初始化长度_数组之初始化 Java
  16. 用python操作浏览器的三种方式,详细介绍并附代码
  17. [翻译] [LaTeX] 分式和二项式 - Fractions and Binomials
  18. iis网站服务器+sql server数据库服务器安全
  19. 实现JPanel切换
  20. DataX数据交换,starrockswriter异常解决

热门文章

  1. 比尔盖茨十条职场箴言:世界不在意你的自尊
  2. PTA——选择法排序
  3. RabbitMQ集群之federation联合插件的使用
  4. 当了一天首富就被“拉下马” ZARA创始人奥特加其人
  5. vnc与windows之间的复制粘贴
  6. deallocate mysql_Mysql预处理语句prepare、execute、deallocate
  7. Oracle—deallocate unused释放高水位空间(二)
  8. Web——网页列表(实验6)
  9. java中浅克隆与深克隆解析
  10. 开放式耳机是什么意思?开放式耳机和封闭式耳机区别又有哪些?