LeetCode题库77.组合——dfs典型解法,递归+回溯+剪枝

 

class Solution:
    def combine(self, n: int, k: int):
        nums=[x+1 for x in range(n)]
        res,ans=[],[]
        def dfs(nums:list[int]):   
            if len(ans)==k:
                ans_copy=ans.copy()#复制,避免ans数组改变使res跟着改变
                res.append(ans_copy)
                return
            for c,i in enumerate(nums[:n-(k-len(ans))+1]):
                ans.append(i)
                dfs(nums[c+1:])
                ans.pop()
        dfs(nums)
        return res


try:
    solution=Solution()
    res=solution.combine(4,2)
    print(res)
    solution=Solution()
    res=solution.combine(4,3)
    print(res)
except:
    print('error')

  

另一种解法:

class Solution:
    def combine(self, n: int, k: int):
        res,ans=[],[]
        def dfs(n,k,start):
            #if start==n-k+2:
            #    return
            if len(ans)==k:
                res.append(ans.copy())
                return
            for i in range(start,n+1):#若start大于n,range(n,n)不报错,直接返回,减少了实现难度。
                    ans.append(i)
                    dfs(n,k,i+1)
                    ans.pop()
        dfs(n,k,1)
        return res

  

 

posted @ 2023-08-27 11:20  Aneverforget  阅读(25)  评论(0)    收藏  举报