【回溯法】some全排列➕组合总和➕括号生成中,摸爬滚打出的回溯法小结

0 初步理解

“回溯”算法也叫“回溯搜索”算法,主要用于在一个庞大的空间里搜索我们所需要的问题的解。
我们每天使用的“搜索引擎”就是帮助我们在庞大的互联网上搜索我们需要的信息。“搜索”引擎的“搜索”和“回溯搜索”算法的“搜索”意思是一样的。

“回溯”指的是“状态重置”,可以理解为“回到过去”、“恢复现场”,是在编码的过程中,是为了节约空间而使用的一种技巧。
而回溯其实是“深度优先遍历”特有的一种现象。
之所以是“深度优先遍历”,是因为我们要解决的问题通常是在一棵树上完成的,在这棵树上搜索需要的答案,一般使用深度优先遍历。

我理解的就是,你需要倒回去一步才能解决问题的题目

1、为什么使用深度优先遍历?

(1)首先是正确性,只有遍历状态空间,才能得到所有符合条件的解;

(2)在深度优先遍历的时候,不同状态之间的切换很容易,可以再看一下上面有很多箭头的那张图,每两个状态之间的差别只有 1 处,因此回退非常方便,这样全局才能使用一份状态变量完成搜索;

(3)如果使用广度优先遍历,从浅层转到深层,状态的变化就很大,此时我们不得不在每一个状态都新建变量去保存它,从性能来说是不划算的;

(4)如果使用广度优先遍历就得使用队列,然后编写结点类。使用深度优先遍历,我们是直接使用了系统栈,系统栈帮助我们保存了每一个结点的状态信息。于是我们不用编写结点类,不必手动编写栈完成深度优先遍历。大家可以尝试使用广度优先遍历实现一下,就能体会到这一点。

作者:liweiwei1419
链接:https://leetcode-cn.com/problems/permutations/solution/hui-su-suan-fa-python-dai-ma-java-dai-ma-by-liweiw/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在这里插入图片描述

1 解题套路

自己的理解的套路,仅供自己以后看哈哈哈哈

首先就是你需要写一个新的dfs函数,返回值类型为空的那种

  • 第一步,在这个函数里面,最难的也就是确定函数的传参数方面,
    这个吗,可以留着最后写的哦
    一般的套路可能是,数组长度len, 索引值i, 目标值target,路径path,结果集res

在这个里面呢,前三个都是int类型,好理解的哦
路径path是List类型,新建的时候语句是List<Integer> path = new ArrayList<>();这个path呢,需要增加新的需要加入的节点,还需要删掉上一个节点实现状态重置,
这个类型,加入节点用的是add方法,如path.add(nums[i]); 删除节点用的是remove方法,如path.remove(path.size() - 1);
但是呢官方建议用 Deque类型, 新建的时候语句是 Deque<Integer> path = new ArrayDeque<>(len); 不过我还是觉得上面的简单
这个类型,加入节点用的是addLast方法,如path.addLast(candidates[i]); 删除节点用的是removeLast方法,如path.removeLast();

结果集res是List<List> res = new ArrayList<>();

  • 第二步是确定到达叶子节点的成功条件
    比如说,
////已经找到满足长度的数组,可以进行返回
if(depth == len){
     //这个地方要进行数据的复制,否则返回的是空
     res.add(new ArrayList<>(path));
     return;
  • 第三步是接下来就进入循环体内,从索引到最后,开始循环,
    判断剪枝条件,进行有效剪枝
    剪枝完成之后,
    没有被用过加入到path路径之中
    然后进行递归dfs操作,注意这个时候的深度是要+1的
    最后要将上次加入的那个值删除掉

题目原有的函数

先来初始化len和结果集res
第一步是进行特判如果len为0,返回空的res

这个时候如果需要去重的话,就要在这里先进行排序

第二步是新建初始化path
如List path = new ArrayList<>(); 或者 Deque path = new ArrayDeque<>(len);

第三步是递归操作

第四步返回结果集res

大功告成~~~~

2 有关题目

LeetCode 46➕47
题解博客地址:[ 热题 HOT 100—46. 全排列➕47. 全排列 II— 回溯法/dfs

LeetCode 39 ➕40
题解博客地址:[ 热题 HOT 100—39. 组合总和➕40. 组合总和 II – 回溯法+剪枝

LeetCode 22

题解博客地址:[ 热题 HOT 100–22. 括号生成-- 回溯算法/深度优先遍历

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章