java回溯_java实现回溯算法
最近有在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实现回溯算法相关推荐
- 基于界面的银行家算法java实现_java实现银行家算法(Swing界面)
java代码实现了银行家算法,界面写的个人认为还是较为细致的,完整的实现了找安全序列等算法功能,可作为参考学习银行家算法. 直接上代码:①界面展示方法: public void ShowFrame() ...
- java 有穷自动机_Java实现雪花算法(snowflake)
本文主要介绍了Java实现雪花算法(snowflake),分享给大家,具体如下: 简单描述 最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一 ...
- ls算法java实现_Java API之算法 | 学步园
本节中所描述的多态 排序(Sorting) 排序算法可为一个 List 重新排序,以使它的元素按照某种排序关系成上升式排序.有两种形式的操作被提供.简单形式的操作只采用一个 List 并按照它的元素的 ...
- 高斯模糊java代码_Java实现高斯模糊算法处理图像
高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop.GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像噪声以及降低细节层次 ...
- java雪花_Java实现雪花算法(snowflake)
本文主要介绍了Java实现雪花算法(snowflake),分享给大家,具体如下: 简单描述 最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一 ...
- 高斯模糊java代码_Java 实现高斯模糊算法
接上篇文章<高斯模糊算法的原理>,本文我们借助 java 来实现高斯模糊算法,并使用高斯模糊算法处理实际图片. 高斯模糊就是图像和高斯函数的卷积.等价于傅里叶变换后乘上高斯函数再逆变换回来 ...
- java轮盘赌_java人工蜂群算法求解TSP问题
初始化: 重复以下过程: 将采蜜蜂与蜜源一一对应,根据上面第一个公式更新蜜源信息,同时确定蜜源的花蜜量: 观察蜂根据采蜜蜂所提供的信息采用一定的选择策略选择蜜源,根据第一个公式更新蜜源信息,同时确定蜜 ...
- java 标记_java的标记算法
1.三色标记法 (1)基本算法:要找出存活对象,根据可达性分析,从GC Roots开始进行遍历访问,可达的则为存活对象. (2)三色:我们把遍历对象图过程中遇到的对象,按"是否访问过&quo ...
- md5 算法java实现_java实现MD5算法
import java.security.MessageDigest; /** 加密工具* @author 刘彦青 * **/ public class EncryptUtil { /** MD5加密 ...
- java 二分_java二分查找算法
算法:当数据量很大适宜采用该方法.采用二分法查找时,数据需是有序不重复的. 基本思想:假设数据是按升序排序的,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功:若 x 小于 ...
最新文章
- 利用Redis进行全页面缓存的简单Demo
- saltstack中salt-key收集的主机名与实际主机名不一致
- java ipv6正则表达式_IPV4和IPV6正则表达式的深入讲解
- hdu 4417 Super Mario 树状数组||主席树
- JavaScript 中 JSON.parse()和JSON.stringify()
- html input日期值,input标签设置时间值
- CoreText入门
- 关卡 动画 蓝图 运行_UE4入门之路(基础蓝图篇):蓝图的制作
- idea集成testng_IDEA+MAVEN+TestNG环境搭建
- maven向本土仓库导入jar包(处理官网没有的jar包)
- 线性渐变 `-webkit-linear-gradient`
- GEF原理及实现系列(四、控制器)
- Banana Pi BPI-R3 评测:详细信息、功能
- 儿童节html5小游戏,适合儿童节活动上玩的亲子互动小游戏
- 面试题 收集请求k千里马
- cin.tie() 输入加速器
- adobe reader xi补丁_Adobe Reader X
- 腾讯投的柠萌影视上市破发:公司市值97亿港元 曾创作《三十而已》
- 《海王》电影观后小感
- 芯片开发工具IAR Embedded Workbench for ARM 7.50.2
热门文章
- 【渝粤教育】电大中专液压与气动技术_1作业 题库
- python制作中文词云图_Python3制作中文词云图
- 一点感悟: 詹姆斯与全栈工程师
- css3做的好看的小便签,纯CSS3 便签条折角效果
- 计算机界面视频录制软件,视频录制工具怎么用?这样的电脑录屏方法超实用!...
- 自媒体赚钱网站有哪些(写文章赚钱的网站大全)
- Latex + IEEEtran模板 + 样例 + 数学符号表
- 支付宝支付出现 openssl_sign(): supplied key param cannot be coerced into a private key
- Error: ‘list‘ object cannot be coerced to type ‘double‘
- gclient多源码管理工具 DEPS文件