Solution1:我的答案
同39题。DFS时间复杂度
,空间复杂度
,k是最终答案的数量,n是元素个数
去重,用set,比较偷懒的做法
class Solution {
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
set<vector<int> > res;
vector<int> temp;
sort(candidates.begin(), candidates.end());
int start = 0;
my_combinate(res, temp, candidates, target, start);
return vector<vector<int> > (res.begin(), res.end());
}
void my_combinate(set<vector<int> >& res, vector<int>& temp,
vector<int>& candidates, int target, int start) {
if (target < 0) return;
else if (target == 0)
res.insert(temp);
else {
for (int i = start; i < candidates.size(); i++) {
temp.push_back(candidates[i]);
my_combinate(res, temp, candidates, target - candidates[i], i + 1);
temp.pop_back();
}
}
}
};
Solution2:
去重:同一层不利用相同的数
class Solution {
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<vector<int> > res;
vector<int> temp;
sort(candidates.begin(), candidates.end());
int start = 0;
my_combinate(res, temp, candidates, target, start);
return res;
}
void my_combinate(vector<vector<int> >& res, vector<int>& temp,
vector<int>& candidates, int target, int start) {
if (target < 0) return;
else if (target == 0)
res.push_back(temp);
else {
for (int i = start; i < candidates.size(); i++) {
if (i > start && candidates[i] == candidates[i-1]) continue;//同一层不用相同的数
temp.push_back(candidates[i]);
my_combinate(res, temp, candidates, target - candidates[i], i + 1);
temp.pop_back();
}
}
}
};