一少年独坐屋中突然顿悟!-回溯
目录
朋友们很快啊!我pa一下就打开博客赶紧记下来了!
接下来就是一个for,一个递归。
这时候传统编程就点到为止了
//对每一个元素进行回溯
for(int i=first;i<=length;i++){
list.add(i);
backtrack(i+1,length,list,k);
//进行回溯
list.remove(list.size()-1);
}
上面是随便截取的很常见的回溯操作,这里主要有三种关键操作记录一下:
- for里面i如果直接i=0,那么递归树是这样一种情况,每一层都可以从头重新取值。
- 如果for里面i=first,first由我们传值给他,这里传值的时候主要分为i或者i+1,注意啦!i和i+1会对回溯树产生什么影响?
- 如果是i,那么首先递归树每一层从第二个结点开始就不能包含之前结点已选的数。
- 如果是i+1,一个很显然的功能也是保证递归树每一层从第二个结点开始就不能包含之前结点已选的数,那么i和i+1的主要区别在于是否当前数可以重复选取!
补充i=0的情况一般属于全排列的情况,但是这种情况有些时候要求解结果不能重复,那么一般加入布尔数组进行剪枝处理一般形式是这样的:
if(arr[i]==arr[i-1]&&!arr[i-1]),i!=0的解法一般用于组合,子集合求解的问题。