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