0
点赞
收藏
分享

微信扫一扫

算法_回溯_组合总和III

陈情雅雅 2022-02-14 阅读 61

文章目录

组合总和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

举报

相关推荐

0 条评论