java实现回溯算法
最近有在leetcode上面做算法题,已经遇到了两道回溯算法的题目,感觉一点思路都没有,现决定将java如何实现回溯算法做一次总结。
什么叫做回溯算法
(摘抄于百度百科)
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。
(摘抄于他人博客)
在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。 若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。 而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。
如何使用回溯算法
回溯我认为也就是一种递归,有以下四个参数,当然不一定是我所举例的类型,要看题目而定
一个全局变量集合保存所有满足条件的答案,举例:List<List> list
一个集合保存一个满足条件的答案,举例:List tempList
算法问题给所给的输入条件,这个可能是一个字符串,也可能是一个数组
附加参数(可有可无,视题目而定)
举例
import java.util.ArrayList;
import java.util.List;
public class Permutations {
//题目描述:Given a collection of distinct integers, return all possible permutations.(给定一组不同的整数,返回其所有的可能组合)
public List<List<Integer>> permute(int[] nums) {
//一个全局变量,用于保存所有集合
List<List<Integer>> list = new ArrayList<>();
//传入三个参数,没有附加参数
backtrack(list, new ArrayList<>(), nums);
return list;
}
private void backtrack(List<List<Integer>> list, List<Integer> 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开始,以此类推。
leetcode上面有关回溯算法的一些题目的实现可查看这个链接:https://leetcode.com/problems/permutations/discuss/18239/A-general-approach-to-backtracking-questions-in-Java-(Subsets-Permutations-Combination-Sum-Palindrome-Partioning)
java实现回溯算法的更多相关文章
- 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化
上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来 ...
- 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同 ...
- 剑指Offer——回溯算法解迷宫问题(java版)
剑指Offer--回溯算法解迷宫问题(java版) 以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.设计程序,对任意设定的迷宫,求出从入口到出口的所有通路. 下面我们来详细讲一 ...
- Java求解迷宫问题:栈与回溯算法
摘要: 使用栈的数据结构及相应的回溯算法实现迷宫创建及求解,带点JavaGUI 的基础知识. 难度: 中级 迷宫问题是栈的典型应用,栈通常也与回溯算法连用. 回溯算法的基本描述是: (1) 选择一个 ...
- 八皇后问题求解java(回溯算法)
八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处 ...
- Java实现KMP算法
/** * Java实现KMP算法 * * 思想:每当一趟匹配过程中出现字符比较不等,不需要回溯i指针, * 而是利用已经得到的“部分匹配”的结果将模式向右“滑动”尽可能远 * 的一段 ...
- 第1次实验——NPC问题(回溯算法、聚类分析)
题目:八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即随意两个皇后都不能处于同一 ...
- 剑指Offer——回溯算法
剑指Offer--回溯算法 什么是回溯法 回溯法实际是穷举算法,按问题某种变化趋势穷举下去,如某状态的变化用完还没有得到最优解,则返回上一种状态继续穷举.回溯法有"通用的解题法"之 ...
- Java数据结构和算法(四)赫夫曼树
Java数据结构和算法(四)赫夫曼树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 赫夫曼树又称为最优二叉树,赫夫曼树的一个 ...
随机推荐
- Excel导出时设置单元格的格式为文本
问题: 用excel导出数据时,如何设置单元格格式的数字分类为"文本",默认是"常规"? 比如:导出编码0235A089,在Excel查看默认显示的是没有前面的 ...
- springboot demo(一)快速开始
快速入门 maven构建项目 1.访问http://start.spring.io/ 2.选择构建工具Maven Project.Spring Boot版本2.26以及一些工程基本信息,点击" ...
- browsers simulator
browsers simulator https://developers.google.com/web/tools/chrome-devtools/device-mode/testing-other ...
- css border-radius & yin-yang & taiji
css border-radius & yin-yang & taiji solution css border-radius & tabs effect https://co ...
- virtual scroll list / dynamic dom list
virtual scroll list / dynamic dom list 虚拟滚动列表 1亿条数据的处理渲染方法 时间分片,不阻塞 DOM web workers 后台进程 Array buffe ...
- The Filesystem Hierarchy Standard of Linux
The Filesystem Hierarchy Standard of Linux linux directory https://zhuanlan.zhihu.com/p/23862856 htt ...
- jquery.query.js
帮助文档 var url = location.search; > "?action=view§ion=info&id=123&debug&te ...
- sql server 局域网与公网上的发布与订阅
一台局域网的服务器,可以访问公网. 一台云端的服务器. 要求:将局域网中的服务器部分数据库同步到云端的服务器上. 配置情况: win server 2012 是发布服务器. win server 20 ...
- Python数据结构与算法_删除排序数组中的重复项(06)
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成. ...
- Mysql之用户认证授权管理
概述 Mysql的认证采用账号密码方式,其中账号由两个部分组成:Host和User:Host为允许登录的客户端Ip,User为当前登录的用户名. 授权没有采用典型的RBAC(基于角色的访问控制),而是 ...