回溯法
解法
就是写一个函数,将目标值或者一个指针传下去,不断构建结果。
如果指针到数组结束或者目标值为 0 就进行结果的判断,成功就推入结果集,否则将上一步推出来。指针下传。
可能需要写到 for 循环,如果是全排列的话,如果只是子集的话,不用。
做过的回溯法
全排列
全排列(30 分钟)
全排列用的递归,写了 30 分钟过关
字典法的 4 步搞完之后,需要运行 n 的阶乘次才行,实在是很糟啊,不过也能得到答案,就是每次找比这次大的最小的,然后运行答案次就可以。挺有意思的,但是很难想出来的方法。
用回溯法重写了一遍
蠢了,全排列只用保存几个了就行!
电话号码的字母组合
电话号码的字母组合(27 分钟)
自己还是用了递归,找 fn 与 fn-1 的关系
用了 switch,换成了数组查找来省去一次遍历还是很好使的,自己又忘了
这里学习了回溯法
括号生成
括号生成(53 分钟)
用了回溯法,一直超时!!
我的回溯法用的很蠢,属于暴力推演,持续优化才过关,其实可以根据题目的特点,不用暴力 for 循环的,特点判断就好了。
组合综合
组合总和(20 分钟)
回溯法非常合适,可是剪枝的方式需要提前才能速度更快。最主要的是要看清题目,看是否回头匹配决定了是否传 index。
组合
组合(1 个小时)—-中等
回溯法,方法很简单,但是剪枝剪了半小时,完全不会剪枝啊,但是回溯法补习了一下,就是根据当前的结果以及剩下的选项算再下一步的结果。
这么神奇的写法吗:
Array(n)
.fill()
.map((_, index) => index + 1);
卧槽,看了一个 nice 的答案,只传 index,然后遍历完了之后数据 pop 一下,再继续遍历。大赞!!
内存优化到了极限!完全没占用其他的位置。
优美的排列
优美的排列(20 分钟)—-中等—–回溯
回溯法,这次没需要剪枝,还是很快,但是我写的执行效率太低了。
换了解题思路,感觉蛮不错的,要看清楚什么是变量!
这一题是可以向回追溯的,所以每次都要全部遍历,然后用一个数组标记谁被遍历过了即可。
子集
子集(15 分钟)—–中等—–回溯
回溯法,用的组合那把的回溯法
优秀答案,哈哈
组合总和 II
组合总和 II(20 分钟)—-中等—–回溯
其实 10 分钟差不多就写出来了,一直在想为什么会出问题,结果只是重复了而已,气死我了
这种回溯法我感觉我差不多了,执行效率也差不多
复原 IP 地址
复原 IP 地址(25 分钟)—-中等—–回溯
写花了 10 分钟,调试花了很久,随便剪个枝就很容易了
分割回文串
分割回文串(15 分钟)—-中等—–回溯
回文串有点意思,即使前面校验失败了,后面也能的
优化个两分钟,效率提高了不少
把回文重写了下,从数组 reverse 改成了 while 判断,更快了。
子集 II
子集 II(20 分钟)—-中等—–回溯
子集的话就是直接添加,不需要判断,不难
字母大小写全排列
字母大小写全排列(15 分钟)—-简单—–回溯
这个全排列需要一直 push,所以也需要一直 pop,还是有点小难的
全排列 II
全排列 II(50 分钟)—-中等—-回溯法
没想到回溯法也要写 forEach,因为要完全回头,所以要 forEach
通过先排序,再相同跳过的方式可以剪枝
第 k 个排列
第 k 个排列(12 分钟)—-中等—-回溯法
全排列一样的回溯法,但是效率较低
换了思路,不再遍历,直接根据值算出来
单词搜索
单词搜索(40 分钟)—中等—回溯
写的太糟了,数组操作很耗时,尽量别用,
思路是对的,没啥问题
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 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" 转载请保留原文链接及作者。