代码随想录算法训练营第二十四天|回溯算法, 77 组合

回溯算法理论知识:

https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80

77 组合:

思路: 找到一个从1-n的list中所有的 k 个元素的组合。 容易想到, 如果k=1, 那么输出这个list 中的元素组成的二维list, 如果 k = n 返回 [input_list], 如果 k > n 返回空。如果k > 1 呢? 那么可以先抽出 1, 然后在 2-n 中找出 k-1 的组合, 再把1 加进去, 然后抽出2, 然后在 3-n 中找出 k-1 的组合, 再把2加进去。。。。

难点: 退出迭代的条件

class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        
        def backtracking(n1: int, n2: int, k: int):
            if k == 1:
                return [[i] for i in range(n1, n2+1)]
            if k == n2 - n1 + 1:
                return [list(range(n1, n2+1))]
            if k > n2 - n1 + 1:
                return []
            
            comb = []
            for j in range(n1, n2):
                _comb = backtracking(j+1, n2, k-1)
                comb += [[j] + one_comb for one_comb in _comb]    
            return comb

        return backtracking(1, n, k)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值