算法_回溯_组合总和III

组合总和III

leetcode链接

1.解法

首先看到这道题,先想到的是穷举所有情况,看是否有满足情况的答案。但是穷举也需要一个数值范围,因为组合中只允许含有 1 - 9 的正整数,所以我们可以先简单的将范围定为[1,9],所以该题目就变为了,从[1,9]中选k个数,使得这k个数的总和为n。这就变为了我之前博客中提到的组合问题了。

所以我们可以写出代码:

def combinationSum3(k, n):
    result = [] # 用来存放最终答案
    path = [] # 用来存储当前情况


    def backtracking(n,k,startindex):
        if len(path)==k:
            if sum(path)==n:
                path1 = path.copy()
                result.append(path1)
            return


        for i in range(startindex,10):
            path.append(i)
            backtracking(n,k,i+1)
            path.pop()

    backtracking(n,k,1)
    return result

2.优化

有两个地方可以优化:

  1. 如果剩余的元素个数少于还没选到的元素个数,那就不用选了。这点和组合问题是一样的。

  2. 首先已经选到的元素的总和已经大于了n,那么也没必要选了。

所以优化后的代码为:

def combinationSum3(k, n):
    result = [] # 用来存放最终答案
    path = [] # 用来存储当前情况


    def backtracking(n,k,startindex):
        if sum(path)>n: # 剪枝2
            return

        if len(path)==k:
            if sum(path)==n:
                path1 = path.copy()
                result.append(path1)
            return


        for i in range(startindex,9-(k-len(path))+2): # 剪枝1
            path.append(i)
            backtracking(n,k,i+1)
            path.pop()

    backtracking(n,k,1)
    return result

3.总结

组合问题的剪枝方法就是:n-(k-len(path))+1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值