LeetCode题解(0216):在1-9的数组中找到数量为A且和为B的所有组合(Python)

本文深入探讨了组合求和III问题,提供了两种高效的解决方案:递归回溯算法和利用itertools库的迭代方法。通过具体代码实现,详细分析了每种方法的时间和空间复杂度,帮助读者理解并掌握算法设计与优化。

题目:原题链接(中等)

标签:回溯算法、数组

解法时间复杂度空间复杂度执行用时
Ans 1 (Python) O ( S × K ) O(S×K) O(S×K) : 其中S为最终答案数量 O ( S × K ) O(S×K) O(S×K)64ms (6.28%)
Ans 2 (Python)32ms (98.25%)
Ans 3 (Python)

解法一(递归):

class Solution:
    def __init__(self):
        self.ans = set()

    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        def iterator(lst, total, num=1):
            # 处理当分支已经达到3个的情况
            if len(lst) == k:
                if total == n:
                    self.ans.add(tuple(lst))

            # 处理分支加上当前元素后小于目标值的情况
            if num <= 9 and total + num <= n:
                # 添加当前元素到分支
                iterator(lst + [num], total + num, num + 1)

                # 不添加当前元素到分支
                iterator(lst, total, num + 1)

        iterator([], 0)

        return [list(elem) for elem in self.ans]

解法二(使用itertools):

class Solution:
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        ans = []
        for group in itertools.combinations([i for i in range(1, 10)], k):
            if sum(group) == n:
                ans.append(list(group))
        return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值