class Solution {
//DFS
//sort candidates first and then DFS
//note here how to get the unique combination: !(index != 0 && candidates[index] == candidates[index-1] && !used[index-1])
//and the cut off trick: sumNow+candidates[index] <= target
public:
vector<vector<int> > combinationSum2(vector<int> &candidates, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
sort(candidates.begin(), candidates.end());
vector<vector<int>> ans;
vector<int> path;
vector<bool> used(candidates.size(), false);
combinationSum_aux(0, 0, target, path, ans, candidates, used);
return ans;
}
void combinationSum_aux( int index, int sumNow, int target, vector<int>& path, vector<vector<int>>& ans, vector<int>& candidates, vector<bool>& used )
{
//throw std::exception("The method or operation is not implemented.");
if(sumNow == target)
{
ans.push_back(path);
return;
}
if(index >= candidates.size())
return;
if( !(index != 0 && candidates[index] == candidates[index-1] && !used[index-1]) && sumNow+candidates[index] <= target)
{//cut off here is very important
used[index] = true;
path.push_back(candidates[index]);
combinationSum_aux(index+1, sumNow+candidates[index], target, path, ans, candidates, used);
path.pop_back();
used[index] = false;
}
combinationSum_aux(index+1, sumNow, target, path, ans, candidates, used);
}
};
second time
class Solution {
public:
void combinationSumUtil(vector<int>& candidates, int target, int curIdx, vector<int>& curPath, vector<bool>& used, vector<vector<int> >& allPath)
{
if(target == 0)
{
allPath.push_back(curPath);
return ;
}
if(target < 0) return;
if(curIdx >= candidates.size()) return;
if(curIdx >= 1 && candidates[curIdx] == candidates[curIdx-1] && used[curIdx-1] == false) combinationSumUtil(candidates, target, curIdx+1, curPath, used, allPath);
else
{
curPath.push_back(candidates[curIdx]);
used[curIdx] = true;
combinationSumUtil(candidates, target-candidates[curIdx], curIdx+1, curPath, used, allPath);
used[curIdx] = false;
curPath.pop_back();
combinationSumUtil(candidates, target, curIdx+1, curPath, used, allPath);
}
}
vector<vector<int> > combinationSum2(vector<int> &candidates, int target) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
sort(candidates.begin(), candidates.end());
vector<int> curPath;
vector<vector<int> > allPath;
vector<bool> used(candidates.size(), false);
combinationSumUtil(candidates, target, 0, curPath, used, allPath);
return allPath;
}
};
467

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



