【Leetcode】NO.216 组合总数III (C++&Python)[回溯]

题目:216. 组合总和 III

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

思路

  1. 回溯:
    在调试的时候错误主要出现在将i弹出的时候sum没有进行相应的减掉;
    其次是i的开始值是不断变化的,不能直接令i=1;

关键点是:找出那些变化的参数,这道题变化的有i和总和sum;其他两个不变的犯错几率小;

代码

C++ 版本


class Solution {
public:
    vector<vector<int>> result;
    vector<int> sub;
    int sum=0;

    vector<vector<int>> combinationSum3(int k, int n) {
        // 相加之和为n 个数为k; 从1-9
        backtrack(k,n,1,sum);
        return result;
    }
    void backtrack(int k, int n,int start,int sum)
    {
        // 退出条件
        if(sub.size()==k&&sum==n)
        {
            result.push_back(sub);
            return;
        }
        for(int i=start;i<=9;i++)
        {
            sub.push_back(i);
            sum+=i;
            backtrack(k,n,i+1,sum);
            sum-=i;
            sub.pop_back();
        }
    }
};

Python 版本

class Solution:
    

    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        # 回溯
        result = []
        sub = []
        sum = 0 
        def backstrack(self, k, n, sum, start):
                
                if(len(sub)==k and sum==n):

                    result.append(sub[:])
                    print(result)
                    return
                for i in range(start,10):
                    sub.append(i)
                    sum += i
                    backstrack(self, k, n, sum, i+1)
                    sum -= i
                    sub.pop()
                


        backstrack(self, k, n, sum, 1)
        return result
    

调试python 的时候出错
image

image
这里放进去的时候是放sub的备份;
如果直接放sub进去的话,后面在回溯的时候会往sub放数据和取数据,这个时候result里的元素会发生变化,也就是直接操作sub的原地址,这个时候会导致最终的结果是空,这是因为在回退的时候会把结果一步步的取出来;

image

posted @ 2022-01-07 19:12  jucw  阅读(31)  评论(0编辑  收藏  举报