77. 组合
题目链接:LeetCode - The World's Leading Online Programming Learning Platform
题目链接/文章讲解:代码随想录
视频讲解:带你学透回溯算法-组合问题(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili
剪枝操作:带你学透回溯算法-组合问题的剪枝操作(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili
解题思路:
采用回溯
设置一个stack path 和一个结果res
定义回溯(n,k,start_index 传入start_index的原因是在回溯时我们需要知道他应该从哪一个起始值进行递归),首先设置basic condition 如果path长度为k时,把path放进res。 如果不合符条件的话 就进入回溯中的for loop,从start_index到n-1(注意我们可以做减枝操作)循环,将当前i append进path,做回溯递归,注意此时start_index是i+1,是从我们当前i的后一位递归。当递归到底返回后 要注意回溯 也就是pop我们的path。
最后执行我们的function并return我们res
class Solution(object):
def combine(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[List[int]]
"""
path=[]
res=[]
def backtracking(n,k,start_index):
if len(path) == k:
res.append(path[:])
return
for i in range(start_index,n-(k-len(path))+2):
path.append(i)
backtracking(n,k,i+1)
path.pop()
backtracking(n,k,1)
return res