https://leetcode-cn.com/problems/subsets/solution/hui-su-suan-fa-by-powcai-5/
上面的题解中,有个题解很有意思,讲了很多回溯的通用类似题
今天:回溯、DP
明天:堆栈、
模板
1 | result=[] |
如果需要全排列,我们需要用visited解决
1 | visited={} #哈希字典,检测是否visited |
如果要给的nums有重复元素,要求返回时没有重复的元素
我们需要先sort排列。
然后跳过重复的数;或者直接检测在不在result中(效率可能低)
遇事不决,就用 in
1 | nums.sort() #需要排序 |
求子集
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
1 | class Solution: |
求子集-ii 去重复
重点是在上一个的基础上
- 对nums排序
- 或检测是否存在于result,或跳过相同的数(开销可能小)
1 | class Solution: |
求全排列
可以用数组就不要用字典了,性能不好
主要是要有一个 visited
数组\哈希字典 来保存已经加入的数,然后大胆遍历就好了
1 | class Solution: |
求全排列-ii 去重复
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
1 | 输入: [1,1,2] |
- 方法1,加上 and listTmp not in result
- 方法2,当上一个元素和当前元素相同,而上一个元素未visited,
1 | class Solution: |
剑指-全排列字符串
下面是我写的思路比较清晰的 visited
回溯写法
由于字符串不能排序,所以只能用 listTmp not in result
来判断,明显效率低了很多。
最后 47 / 52 个通过测试用例 ,就超时了,所以还是借鉴网上老哥的清爽写法吧。
1 | class Solution: |
这个 DFS
有剪枝,所以时间复杂度还过的过去
1 | class Solution: |
组合总和
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:
1 | 输入:candidates = [2,3,6,7], target = 7, |
示例 2:
1 | 输入:candidates = [2,3,5], target = 8, |
代码如下
1 | class Solution: |
打印从1到最大的n位数
1 | class Solution: |