题目

解析:
这题是77的follow up。只需要做很小的改动就可以了如下:
- 77因为不可以用重复数字,所以在recursion的时候传的参数是i + 1,而这边每个数字可以被重复用,所以传i
- 在recursion开始的时候判断当前组合是不是符合要求
python代码如下:
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
def back_tracking(curr,first):
if sum(curr) == target:
ans.append(curr[:])
return
if sum(curr) > target:
return
for i in range(first,len(candidates)):
curr.append(candidates[i])
back_tracking(curr,i)//i here but i+1 in 77
curr.pop()
ans = []
back_tracking([],0)
return ans
C++版本如下:
由于c++里没有提供求和的库函数,所以需要单独变量保存current sum
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> ans;
vector<int> curr;
back_tracking(0,curr,0,target,ans,candidates);
return ans;
}
void back_tracking(int first,vector<int> curr,int currsum,int target,vector<vector<int>>& ans,vector<int>& candidates){
if (currsum==target){
ans.push_back(curr);
return;
}
if (currsum>target) return;
for (int i=first;i<candidates.size();++i){
curr.push_back(candidates[i]);
back_tracking(i,curr,currsum+candidates[i],target,ans,candidates);
curr.pop_back();
}
}
};
本文详细解析了LeetCode上的经典题目“组合总和”(Combination Sum),并提供了Python和C++两种语言的实现代码。通过递归算法,实现了在给定的候选数字集合中寻找所有可能的组合,使得这些组合的元素之和等于目标值。文章对比了此题与LeetCode 77题的不同之处,展示了如何调整递归参数以允许数字的重复使用。
1595

被折叠的 条评论
为什么被折叠?



