Combination Sum
Given a set of candidate numbers (candidates
) (without duplicates) and a target number (target
), find all unique combinations in candidates
where the candidate numbers sums to target
.
The same repeated number may be chosen from candidates
unlimited number of times.
Note:
- All numbers (including
target
) will be positive integers. - The solution set must not contain duplicate combinations.
Example 1:
Input: candidates =
[2,3,6,7],
target =
7
,
A solution set is:
[
[7],
[2,2,3]
]
Example 2:
Input: candidates = [2,3,5]
,
target = 8,
A solution set is:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
题解:
题目给了我们一个candidates array 和一个 target, 让我们从array 里找到所有的组合,它的和是等于target的。任何组合只要是它的和等于target的话,都需要找到,但是不需要重复的。这道题中是可以重复利用一个数字的,那么我们就需要每次都代入同一个数字,直到它之和达到target 或者它超过了target, 然后在倒退回去一个数字,继续找下一个数字,这种情况肯定是要用递归了。这里是backtracking,每次倒退回一个数字,需要继续递归下去,在倒退,一直重复直到搜索了所有的可能性。
Answer:
class Solution {
public:
void dfs(int target, vector<int>& candidates, int start, vector<int> temp, vector<vector<int>>& res) {
if (target == 0) {
res.push_back(temp);
return;
}
for (int i = start; i < candidates.size(); i++) {
if (i != 0 && candidates[i] == candidates[i - 1]) continue;
int n = target - candidates[i];
if (n >= 0) {
temp.push_back(candidates[i]);
dfs(n, candidates, i, temp, res);
temp.pop_back();
}
}
return;
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
unordered_map<int, bool> map;
vector<vector<int>> res;
vector<int> temp;
dfs(target, candidates, 0, temp, res);
return res;
}
};