39. Combination Sum(AC代码)
给定数组candidates
,不含重复元素,求一个组合(允许重复使用),使得和为target
class Solution {
public:
vector<int> x;
vector<vector<int>> result;
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sort( candidates.begin(), candidates.end() );
dfs( candidates, target, 0, 0 );
return result;
}
// 参数index表示数组nums[index..end]用于构造x
void dfs( vector<int>& nums, int target, int cur_sum, int index )
{
if( cur_sum == target )
{
result.push_back(x);
return;
}
else if( cur_sum > target )
return;
for( int i = index; i < nums.size(); i++ )
{
x.push_back( nums[i] );
dfs( nums, target, cur_sum + nums[i], i ); // 此处设置了参数index为i,保证构造的x是升序的
x.pop_back();
}
}
};
【相似题目】78. Subsets(AC代码)
40. Combination Sum II(AC代码)
给定数组candidates
,存在重复元素,求一个组合(每个元素只允许使用1次),使得和为target
class Solution {
public:
vector<int> x;
vector<vector<int>> result;
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort( candidates.begin(), candidates.end() );
dfs( candidates, target, 0, 0 );
return result;
}
void dfs( vector<int>& nums, int target, int cur_sum, int index )
{
if( cur_sum == target )
{
result.push_back(x);
return;
}
else if( cur_sum > target ) // 剪枝
return;
for( int i = index; i < nums.size(); i++ )
{
// 去除另一种重复:[6(1), 7(1)], [6(2), 7(1)],第1个“6”和第2个“6”
if( i > index && nums[i] == nums[i - 1] )
continue;
x.push_back( nums[i] );
dfs( nums, target, cur_sum + nums[i], i + 1 );
x.pop_back();
}
}
};
【相似题目】90. Subsets II(AC代码)