77. 组合
给定两个整数
n
和k
,返回范围[1, n]
中所有可能的k
个数的组合。你可以按 任何顺序 返回答案。
class Solution:
def __init__(self):
self.res=[]
def combine(self, n: int, k: int) -> List[List[int]]:
self.helper(n,k,[],1)
return self.res
def helper(self,n,k,curr,start):
if len(curr)==k:
self.res.append(curr[:])
return
# 剪枝优化的地方:[start,n-(k-len(crr)+1)]
# 已选择的元素个数为len(curr)
# 还需要选择的元素个数为k-len(curr)
# 那么集合中至多要从n-(k-len(curr))+1开始遍历
# +1 是因为要包括起始位置,要的是左闭的集合
for i in range(start,n-(k-len(curr)+2)):
curr.append(i)
self.helper(n,k,curr,i+1)
curr.pop()
举个例子,n = 4,k = 3, 目前已经选取的元素为0(path.size为0),n - (k - 0) + 1 即 4 - ( 3 - 0) + 1 = 2。
从2开始搜索都是合理的,可以是组合[2, 3, 4]