77. 组合
难度:☆3
本题是回溯法经典模板题,可对照回溯三部曲学习,把回溯法的搜索过程抽象为树形结构。
a. 递归法+回溯
- 不剪枝优化,耗时很长。
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
result = []
path = []
def backTrack(n: int, k: int, startIndex: int) -> None:
if len(path) == k:
result.append(path[:]) # 一种硬拷贝方法
return
for i in range(startIndex, n+1): # 此处没有剪枝
path.append(i)
backTrack(n, k, i+1) # 递归
path.pop() # 回溯
backTrack(n, k, 1)
return result
- 剪枝优化,减少耗时。
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
result = []
path = []
def backTrack(n: int, k: int, startIndex: int) -> None:
if len(path) == k:
result.append(path.copy()) # 另一种硬拷贝方法
return
for i in range(startIndex, n-(k-len(path))+2): # 剪枝优化
path.append(i)
backTrack(n, k, i+1) # 递归
path.pop() # 回溯
backTrack(n, k, 1)
return result
Python Doc:
软拷贝是指在Python中,对于可变对象,如列表、字典等,赋值操作只是将对象的引用复制给了新的变量,而不是将对象本身复制一份。这样,如果新的变量修改了对象,原来的变量也会受到影响。这种复制方式称为软拷贝。以下是一个软拷贝的例子:
old_list = [1, 2, 3]
new_list = old_list
new_list.append(4)
print(old_list) # [1, 2, 3, 4]
如果想要复制一个列表,但不想让新列表和原列表共享内存空间,可以使用硬拷贝。硬拷贝可以通过切片、copy()函数、list()函数等方式实现。
要进行硬拷贝,可以使用以下方法:
- 使用切片操作符[:]:
new_list = old_list[:]
- 使用copy()函数:
new_list = old_list.copy()
- 使用list()函数:
new_list = list(old_list)
以下是一个硬拷贝的例子:
old_list = [1, 2, 3]
new_list = old_list[:]
new_list.append(4)
print(old_list) # [1, 2, 3]
print(new_list) # [1, 2, 3, 4]