【Leetcode】NO.216 组合总数III (C++&Python)[回溯]
题目:216. 组合总和 III
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
思路
- 回溯:
在调试的时候错误主要出现在将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 的时候出错
这里放进去的时候是放sub的备份;
如果直接放sub进去的话,后面在回溯的时候会往sub放数据和取数据,这个时候result里的元素会发生变化,也就是直接操作sub的原地址,这个时候会导致最终的结果是空,这是因为在回退的时候会把结果一步步的取出来;
本文来自博客园,作者:jucw,转载请注明原文链接:https://www.cnblogs.com/Jucw/p/15776553.html