【代码随想录】回溯6
491.递增子序列
给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。
示例 1:
输入:nums = [4,6,7,7]
输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]
思路
注意这道题和 组合II 类似,但是不能对给定的数组进行排序,也就不能使用 used 数组来进行去重。所以使用 set 来进行去重。

注意判断是否加入当前元素的条件有两个,只要满足其一就跳过
- 当前元素小于 cur 的末尾元素(cur 不为空时)
- 当前元素使用过(在 set 中)
1 | class Solution: |
332.重新安排行程
给定一组机票 tickets = [[“JFK”, “SFO”], [“JFK”, “ATL”], [“SFO”, “ATL”], …];
每张票只用一次;要求从 “JFK” 出发,找出按字典序最小的行程;输出一个行程列表,比如 [“JFK”, “ATL”, “JFK”, “SFO”, “ATL”, “SFO”]。
思路
首先需要把所有的机票存起来,使用 dict 来进行存储,然后当前的结果 cur 一定以 “JFK” 开头。递归三部曲:
- 递归参数和返回值:如果找到一条路径,就返回 True,类似于解数独
- 终止条件:遍历完所有的 ticket,同样类似于解数独
- 核心逻辑:获取当前 cur 的末尾机场,然后遍历以当前末尾机场出发的 ticket,将当前 ticket 加入 cur,然后递归调用。
1 | from collections import defaultdict |
注意:
- 每张机票只能用一次,所以要标记用过
- 按字典序排序邻接表来确保最小路径先被试出来
- 起点必须是 “JFK” 固定出发点
- 回溯需恢复现场,恢复 cur 和机票使用状态
目前回溯法会超时??