回溯法

解法

就是写一个函数,将目标值或者一个指针传下去,不断构建结果。
如果指针到数组结束或者目标值为 0 就进行结果的判断,成功就推入结果集,否则将上一步推出来。指针下传。
可能需要写到 for 循环,如果是全排列的话,如果只是子集的话,不用。

做过的回溯法

全排列

全排列(30 分钟)
全排列用的递归,写了 30 分钟过关
字典法的 4 步搞完之后,需要运行 n 的阶乘次才行,实在是很糟啊,不过也能得到答案,就是每次找比这次大的最小的,然后运行答案次就可以。挺有意思的,但是很难想出来的方法。
用回溯法重写了一遍
image.png
蠢了,全排列只用保存几个了就行!

电话号码的字母组合

电话号码的字母组合(27 分钟)
自己还是用了递归,找 fn 与 fn-1 的关系
用了 switch,换成了数组查找来省去一次遍历还是很好使的,自己又忘了
这里学习了回溯法

括号生成

括号生成(53 分钟)
用了回溯法,一直超时!!
我的回溯法用的很蠢,属于暴力推演,持续优化才过关,其实可以根据题目的特点,不用暴力 for 循环的,特点判断就好了。

组合综合

组合总和(20 分钟)
回溯法非常合适,可是剪枝的方式需要提前才能速度更快。最主要的是要看清题目,看是否回头匹配决定了是否传 index。

组合

组合(1 个小时)—-中等
回溯法,方法很简单,但是剪枝剪了半小时,完全不会剪枝啊,但是回溯法补习了一下,就是根据当前的结果以及剩下的选项算再下一步的结果。

这么神奇的写法吗:

Array(n)
  .fill()
  .map((_, index) => index + 1);

卧槽,看了一个 nice 的答案,只传 index,然后遍历完了之后数据 pop 一下,再继续遍历。大赞!!
内存优化到了极限!完全没占用其他的位置。

优美的排列

优美的排列(20 分钟)—-中等—–回溯
回溯法,这次没需要剪枝,还是很快,但是我写的执行效率太低了。
换了解题思路,感觉蛮不错的,要看清楚什么是变量!
这一题是可以向回追溯的,所以每次都要全部遍历,然后用一个数组标记谁被遍历过了即可。

子集

子集(15 分钟)—–中等—–回溯
回溯法,用的组合那把的回溯法
image.png
优秀答案,哈哈

组合总和 II

组合总和 II(20 分钟)—-中等—–回溯
其实 10 分钟差不多就写出来了,一直在想为什么会出问题,结果只是重复了而已,气死我了
这种回溯法我感觉我差不多了,执行效率也差不多
image.png

复原 IP 地址

复原 IP 地址(25 分钟)—-中等—–回溯
写花了 10 分钟,调试花了很久,随便剪个枝就很容易了
image.png

分割回文串

分割回文串(15 分钟)—-中等—–回溯
回文串有点意思,即使前面校验失败了,后面也能的
image.png
优化个两分钟,效率提高了不少
把回文重写了下,从数组 reverse 改成了 while 判断,更快了。

子集 II

子集 II(20 分钟)—-中等—–回溯
子集的话就是直接添加,不需要判断,不难
image.png

字母大小写全排列

字母大小写全排列(15 分钟)—-简单—–回溯
这个全排列需要一直 push,所以也需要一直 pop,还是有点小难的
image.png

全排列 II

全排列 II(50 分钟)—-中等—-回溯法
没想到回溯法也要写 forEach,因为要完全回头,所以要 forEach
通过先排序,再相同跳过的方式可以剪枝
image.png

第 k 个排列

第 k 个排列(12 分钟)—-中等—-回溯法
全排列一样的回溯法,但是效率较低
image.png
换了思路,不再遍历,直接根据值算出来
image.png

单词搜索

单词搜索(40 分钟)—中等—回溯
写的太糟了,数组操作很耗时,尽量别用,
思路是对的,没啥问题
image.png


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 981909093@qq.com

文章标题:回溯法

文章字数:1.1k

本文作者:泽鹿

发布时间:2019-08-29, 16:53:02

最后更新:2019-08-29, 17:08:07

原始链接:http://panyifei.github.io/2019/08/29/算法/leetcode/回溯法/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏