回溯

22. 括号生成

输入:n = 3
输出:[
       "((()))",
       "(()())",
       "(())()",
       "()(())",
       "()()()"
     ]

用了回溯算法。设置一个函数 f(列表,left,right) 这里用的是if if 不是if else。如果左括号left<n,则list.append("(")然后 f(列表,left+1,right)然后list.pop()
如果right<left,则list.append(")")然后 f(列表,left,right+1)然后list.pop()
如果rightleftn,则把“”.join(列表) 添加到最后新建的结果列表里去

46. 全排列

输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

回溯 深度优先 dfs(一个res空列表,一个leg充满False的列表)
判断终止条件 if空列表长度等于N。则最后的结果列表里append(列表 [ : ] )
for i in range(N) 如果leg[i]是false 则res.append(nums[i]) ,leg[i]=true, dfs(res,leg), res.pop() leg[i]=False

491. 递增子序列

给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。
示例:
输入: [4, 6, 7, 7]
输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]
res=set()
def dfs(i,r):
   if len(r)>=2:                          #先判断是否长度大于2加进去,因为 如果先判断是否出数组返回时,最后一个数上一轮加进去后在返回之前就不能添加进res里
       res.add(r)
   if i>=len(nums):                       #后判断i是否出数组,返回
       return
   if not r or nums[i]>=r[-1]:
       dfs(i+1,r+(nums[i],))
   dfs(i+1,r)
dfs(0,())                      # set里面需要是元祖 因为不可变 要是是列表的话就不行
return list(res)

332. 重新安排行程

给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。	
说明:
如果存在多种有效的行程,你可以按字符自然排序返回最小的行程组合。例如,行程 ["JFK", "LGA"] 与 ["JFK", "LGB"] 相比就更小,排序更靠前
所有的机场都用三个大写字母表示(机场代码)。
假定所有机票至少存在一种合理的行程。
示例 1:	
输入: [["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
输出: ["JFK", "MUC", "LHR", "SFO", "SJC"]
                                                  # D=collections.defaultdict(list)
D={}
for a,b in tickets:
                                                    # D[a].append(b)
    D.setdefault(a,[]).append(b)   
for v in D.values():
    v.sort()
res=[]
def m(a):
    while D.setdefault(a,[]):                        #while D[a]:
        m(D[a].pop(0))
    res.insert(0,a)
m('JFK')
return res
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值