力扣题目:#491.递增子序列
刷题时长:参考题解后10min
解题方法:回溯 + set去重
复杂度分析
- 时间 O(n * 2^n)
- 空间O(n)
问题总结
- 去重逻辑错,此题不能预先排序,且只能在树层层面去重
本题收获
- 利用set()去重:难点在此set无需回溯,在每层递归时初始化为空集,才能用以记录每层树层中使用过的元素
力扣题目:#46.全排列
刷题时长:20min
解题方法:回溯(无startIndex)+ usedlist
复杂度分析
- 时间O(n!)
- 空间O(n)
问题总结
- for循环内无需startIndex而应该从头开始遍历,通过usedlist记录元素是否已使用并跳过
- 赋值用一个=即可,判断才用==
本题收获
- 排列问题与组合的不同:1)每层都是从0开始搜索而不是startIndex;2)需要used数组记录path里都放了哪些元素了
力扣题目:#47.全排列 II
刷题时长:10min
解题方法:回溯(无startIndex)+ 去重(sort + usedlist)
复杂度分析
- 时间O(n!)
- 空间O(n)
问题总结
- 去重之前忘记先排序
本题收获
- 树枝去重:有序数组中前一位已用,即used[i-1] == 1时continue跳过此循环
- 本题难点:题目集合中有重复元素,要求答案集中不含重复组
- 收集结果:组合问题和排列问题是在树形结构的叶子节点上收集结果,而子集问题就是取树上所有节点的结果