LINTCODE——数字组合,数字组合II
说明:两题都是采用回溯法解决问题,只是回溯条件和最后数值处理方法略有不同;
数字组合:由于每个数字都可以重复使用,所以把回溯情况分为两种:一是取当前值;二是把当前值去掉,取下一个值;
class Solution {
public:
/*
* @param candidates: A list of integers
* @param target: An integer
* @return: A list of lists of integers
*/
vector<vector<int>> combinationSum(vector<int> &candidates, int target) {
// write your code here
vector<vector<int> > res ;
vector<int> restemp;
//排序
sort(candidates.begin(),candidates.end());
restemp.push_back(candidates[0]);
comb(res,restemp,candidates,0,target, candidates[0]);
return res;
}
void comb(vector<vector<int> > &res , vector<int> restemp, vector<int> &num, int index , const int &target ,int sum)
{
if(sum == target)
{
res.push_back(restemp);
return;
}
if(sum > target)
return ;
//要不取当前INDEX,要不不取当前(删除当前),取后一个,即INDEX+1
if(index < num.size())
{
restemp.push_back(num[index]);
comb(res , restemp, num , index ,target ,sum +num[index] );
}
if(index + 1 < num.size())
{
//删除当前取后一个操作
restemp.erase(restemp.end()-1);
restemp[restemp.size()-1] = num[index+1];
sum -= num[index];
comb(res , restemp, num , index+1 ,target , sum + num[index+1]);
}
}
};
数字组合II:
每个数值只能取一个,直接回溯选择取当前或者不取当前就可以了,在有重复数字的情况下,需注意的情况是:当num为{1,1,3,7,8,9},target = 8,这个时候如果用双容器型采值,则会出现两个[1,7],[1,7],所以代码当中先用set
class Solution {
public:
/*
* @param num: Given the candidate numbers
* @param target: Given the target number
* @return: All the combinations that sum to target
*/
vector<vector<int>> combinationSum2(vector<int> &num, int target) {
// write your code here
//使用set是为了防止出现重复解;
set<vector<int> > res ;
vector<int> restemp;
//排序
sort(num.begin(),num.end());
comb(res,restemp,num,0,target, 0);
vector<vector<int> >ret(res.begin(),res.end());
return ret;
}
void comb(set<vector<int> > &res , vector<int> restemp, vector<int> &num, int index , const int &target ,int sum)
{
if(sum == target)
{
res.insert(restemp);
return;
}
if(sum > target)
return ;
if(index < num.size())
//由于每个只取一次,则是简单的取或者不取问题
{
comb(res , restemp, num , index + 1 ,target ,sum );
restemp.push_back(num[index]);
comb(res , restemp, num , index+1 ,target , sum + num[index]);
}
}
};