给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
第一次的代码:
直接递归
t=[]
for i in range(1,n+1):
t.append(i)
ANS=[]
def zuhe(ans):
ans.sort()
if len(ans)==k and ans not in ANS:
ANS.append(ans)
return
else:
for i in t:
if i not in ans :
zuhe(ans+[i])
zuhe([])
return ANS
n=10,k=7超时了,实际上,n=9,k=4的执行时间已经1112ms了。
这两天国内leetcode力扣崩了,我只能去英文原版leetcode提交了
第三次的代码:稍微优化一下:
ANS=[]
start=0
def zuhe(ans):
ans.sort()
if len(ans)==k and ans not in ANS:
ANS.append(ans)
return
else:
if ans :start=ans[-1] #这里优化,如果ans已经有数,则新数字从ans[-1]+1开始
else:start=0 #若ans为空,则从0+1开始
for i in range(start+1,n+1):
zuhe(ans+[i])
zuhe([])
return ANS
1172ms,排名10%
第四次代码:
再优化一下:设置count来表示需要添加的数字
ANS=[]
def zuhe(ans,count):
if len(ans)==k:
ANS.append(ans)
for i in range(count,n+1):#从count开遍历i
zuhe(ans+[i],i+1) #将i+1作为下一个数字加入排列
zuhe([],1)
return ANS
680ms,排名30%
第五次代码:
再优化一下,把k加入递归,同时,加入一个判断条件,即在每一次选择要添加到排列的数字时,判断k<=n-i+1,即当前需要k个数字才能满足要求,当需要k个数字时,若i(包括i)之后的数字没有k个,就表示这个数不能排了,例如k=2,n=4,当选到[4]时,4后面都没数字了,所以以4开头的组合必不能成功
ANS=[]
def zuhe(ans,count,k):
if k==0:
ANS.append(ans)
for i in range(count,n+1):
if k>(n-i+1):
break
zuhe(ans+[i],i+1,k-1)
zuhe([],1,k)
return ANS
172ms,排名76%