39. Combination Sum
class Solution {
private:
vector<vector<int>> ret;
vector<int> tmp;
public:
void solve(vector<int>& arr, int start, int target) {
if (target == 0) {
vector<int> nn = tmp;
ret.push_back(nn);
return;
}
for (int i = start; i < arr.size(); i++) {
if (target - arr[i] >= 0) {
tmp.push_back(arr[i]);
solve(arr, i, target - arr[i]);
tmp.pop_back();
}
}
}
vector<vector<int>> combinationSum(vector<int>& arr, int target) {
solve(arr, 0, target);
return ret;
}
};
40. Combination Sum II
class Solution {
private:
vector<vector<int>> ret;
vector<int> tmp;
public:
void solve(vector<int>& arr, int len, int start, int target) {
if (target == 0) {
vector<int> nn = tmp;
ret.push_back(nn);
return;
}
for (int i = start; i < len; i++) {
if (target - arr[i] >= 0) {
tmp.push_back(arr[i]);
solve(arr, len, i + 1, target - arr[i]);
tmp.pop_back();
while (i + 1 < len && arr[i + 1] == arr[i]) i++;
}
}
}
vector<vector<int>> combinationSum2(vector<int>& arr, int target) {
sort(arr.begin(), arr.end());
int len = arr.size();
solve(arr, len, 0, target);
return ret;
}
};
216. Combination Sum III
class Solution {
private:
vector<vector<int>> ret;
vector<int> tmp;
int kk, nn;
void solve(int cnt, int start, int target) {
if (cnt == kk) {
if (target != 0) return;
vector<int> nn = tmp;
ret.push_back(nn);
return;
}
for (int i = start; i <= 9; i++) {
if (target >= i) {
tmp.push_back(i);
solve(cnt + 1, i + 1, target - i);
tmp.pop_back();
}
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
kk = k, nn = n;
solve(0, 1, n);
return ret;
}
};