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

一、什么叫做回溯算法

(摘抄于百度百科)

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

(摘抄于他人博客)

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

二、如何使用回溯算法

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

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

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

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

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

下面具体以leetcode上的一道题目为例,这样能更好的理解

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

public List> permute(int[] nums) {//一个全局变量,用于保存所有集合

List> list = new ArrayList<>();//传入三个参数,没有附加参数

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

}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 voidmain(String[] args){int[] nums={1,2,3};

(newPermutations()).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实现_java实现银行家算法(Swing界面)

    java代码实现了银行家算法,界面写的个人认为还是较为细致的,完整的实现了找安全序列等算法功能,可作为参考学习银行家算法. 直接上代码:①界面展示方法: public void ShowFrame() ...

  2. java 有穷自动机_Java实现雪花算法(snowflake)

    本文主要介绍了Java实现雪花算法(snowflake),分享给大家,具体如下: 简单描述 最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一 ...

  3. ls算法java实现_Java API之算法 | 学步园

    本节中所描述的多态 排序(Sorting) 排序算法可为一个 List 重新排序,以使它的元素按照某种排序关系成上升式排序.有两种形式的操作被提供.简单形式的操作只采用一个 List 并按照它的元素的 ...

  4. 高斯模糊java代码_Java实现高斯模糊算法处理图像

    高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop.GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像噪声以及降低细节层次 ...

  5. java雪花_Java实现雪花算法(snowflake)

    本文主要介绍了Java实现雪花算法(snowflake),分享给大家,具体如下: 简单描述 最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一 ...

  6. 高斯模糊java代码_Java 实现高斯模糊算法

    接上篇文章<高斯模糊算法的原理>,本文我们借助 java 来实现高斯模糊算法,并使用高斯模糊算法处理实际图片. 高斯模糊就是图像和高斯函数的卷积.等价于傅里叶变换后乘上高斯函数再逆变换回来 ...

  7. java轮盘赌_java人工蜂群算法求解TSP问题

    初始化: 重复以下过程: 将采蜜蜂与蜜源一一对应,根据上面第一个公式更新蜜源信息,同时确定蜜源的花蜜量: 观察蜂根据采蜜蜂所提供的信息采用一定的选择策略选择蜜源,根据第一个公式更新蜜源信息,同时确定蜜 ...

  8. java 标记_java的标记算法

    1.三色标记法 (1)基本算法:要找出存活对象,根据可达性分析,从GC Roots开始进行遍历访问,可达的则为存活对象. (2)三色:我们把遍历对象图过程中遇到的对象,按"是否访问过&quo ...

  9. md5 算法java实现_java实现MD5算法

    import java.security.MessageDigest; /** 加密工具* @author 刘彦青 * **/ public class EncryptUtil { /** MD5加密 ...

  10. java 二分_java二分查找算法

    算法:当数据量很大适宜采用该方法.采用二分法查找时,数据需是有序不重复的. 基本思想:假设数据是按升序排序的,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功:若 x 小于 ...

最新文章

  1. 利用Redis进行全页面缓存的简单Demo
  2. saltstack中salt-key收集的主机名与实际主机名不一致
  3. java ipv6正则表达式_IPV4和IPV6正则表达式的深入讲解
  4. hdu 4417 Super Mario 树状数组||主席树
  5. JavaScript 中 JSON.parse()和JSON.stringify()
  6. html input日期值,input标签设置时间值
  7. CoreText入门
  8. 关卡 动画 蓝图 运行_UE4入门之路(基础蓝图篇):蓝图的制作
  9. idea集成testng_IDEA+MAVEN+TestNG环境搭建
  10. maven向本土仓库导入jar包(处理官网没有的jar包)
  11. 线性渐变 `-webkit-linear-gradient`
  12. GEF原理及实现系列(四、控制器)
  13. Banana Pi BPI-R3 评测:详细信息、功能
  14. 儿童节html5小游戏,适合儿童节活动上玩的亲子互动小游戏
  15. 面试题 收集请求k千里马
  16. cin.tie() 输入加速器
  17. adobe reader xi补丁_Adobe Reader X
  18. 腾讯投的柠萌影视上市破发:公司市值97亿港元 曾创作《三十而已》
  19. 《海王》电影观后小感
  20. 芯片开发工具IAR Embedded Workbench for ARM 7.50.2

热门文章

  1. 【渝粤教育】电大中专液压与气动技术_1作业 题库
  2. python制作中文词云图_Python3制作中文词云图
  3. 一点感悟: 詹姆斯与全栈工程师
  4. css3做的好看的小便签,纯CSS3 便签条折角效果
  5. 计算机界面视频录制软件,视频录制工具怎么用?这样的电脑录屏方法超实用!...
  6. 自媒体赚钱网站有哪些(写文章赚钱的网站大全)
  7. Latex + IEEEtran模板 + 样例 + 数学符号表
  8. 支付宝支付出现 openssl_sign(): supplied key param cannot be coerced into a private key
  9. Error: ‘list‘ object cannot be coerced to type ‘double‘
  10. gclient多源码管理工具 DEPS文件