Skip to content

Commit 158c1ff

Browse files
Add C++ implementation
Signed-off-by: begeekmyfriend <[email protected]>
1 parent dec7504 commit 158c1ff

File tree

11 files changed

+72
-38
lines changed

11 files changed

+72
-38
lines changed

0039_combination_sum/combination_sum.cc

+4-4
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ using namespace std;
55
class Solution {
66
public:
77
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
8-
vector<int> stack;
98
vector<vector<int>> res;
10-
dfs(candidates, 0, target, stack, res);
9+
dfs(candidates, 0, target, res);
1110
return res;
1211
}
1312

1413
private:
15-
void dfs(vector<int>& candidates, int start, int target, vector<int>& stack, vector<vector<int>>& res) {
14+
vector<int> stack;
15+
void dfs(vector<int>& candidates, int start, int target, vector<vector<int>>& res) {
1616
if (target < 0) {
1717
return;
1818
} else if (target == 0) {
@@ -21,7 +21,7 @@ class Solution {
2121
for (int i = start; i < candidates.size(); i++) {
2222
stack.push_back(candidates[i]);
2323
/* The elements in solution can be duplicate for the purpose of the problem */
24-
dfs(candidates, i, target - candidates[i], stack, res);
24+
dfs(candidates, i, target - candidates[i], res);
2525
stack.pop_back();
2626
}
2727
}

0040_combination_sum_ii/combination_sum.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ static void dfs(int *nums, int size, int start, int target, int *solution,
2525
int last = INT_MIN;
2626
for (i = start; i < size; i++) {
2727
if (last != nums[i]) {
28-
/* No duplicate combinations in different order */
28+
/* No duplicate combinations in the same level position */
2929
solution[len] = nums[i];
3030
/* i + 1 limits the candidate range in next levels */
3131
dfs(nums, size, i + 1, target - nums[i], solution, len + 1, results, count, column_sizes);

0040_combination_sum_ii/combination_sum.cc

+5-5
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ using namespace std;
55
class Solution {
66
public:
77
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
8-
vector<int> stack;
98
vector<vector<int>> res;
109
sort(candidates.begin(), candidates.end());
11-
dfs(candidates, 0, target, stack, res);
10+
dfs(candidates, 0, target, res);
1211
return res;
1312
}
1413

1514
private:
16-
void dfs(vector<int>& candidates, int start, int target, vector<int>& stack, vector<vector<int>>& res) {
15+
vector<int> stack;
16+
void dfs(vector<int>& candidates, int start, int target, vector<vector<int>>& res) {
1717
if (target < 0) {
1818
return;
1919
} else if (target == 0) {
@@ -22,10 +22,10 @@ class Solution {
2222
int last = INT_MIN;
2323
for (int i = start; i < candidates.size(); i++) {
2424
if (last != candidates[i]) {
25-
/* No duplicate combinations in different order */
25+
/* No duplicate combinations in the same level position */
2626
stack.push_back(candidates[i]);
2727
/* i + 1 limits the candidate range in next levels */
28-
dfs(candidates, i + 1, target - candidates[i], stack, res);
28+
dfs(candidates, i + 1, target - candidates[i], res);
2929
stack.pop_back();
3030
}
3131
last = candidates[i];

0046_permutations/permutations.cc

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ class Solution {
66
public:
77
vector<vector<int>> permute(vector<int>& nums) {
88
vector<vector<int>> res;
9-
vector<int> stack;
109
vector<bool> used(nums.size());
11-
dfs(nums, used, stack, res);
10+
dfs(nums, used, res);
1211
return res;
1312
}
1413

1514
private:
16-
void dfs(vector<int>& nums, vector<bool>& used, vector<int>& stack, vector<vector<int>>& res) {
15+
vector<int> stack;
16+
void dfs(vector<int>& nums, vector<bool>& used, vector<vector<int>>& res) {
1717
if (stack.size() == nums.size()) {
1818
res.push_back(stack);
1919
} else {
@@ -23,7 +23,7 @@ class Solution {
2323
// Used marks only allows remaining elements in DFS levels
2424
used[i] = true;
2525
stack.push_back(nums[i]);
26-
dfs(nums, used, stack, res);
26+
dfs(nums, used, res);
2727
stack.pop_back();
2828
used[i] = false;
2929
}

0047_permutations_ii/permutations.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ static void dfs(int *nums, int size, bool *used, int *stack,
2323
/* Used marks only allows remaining elements in DFS levels */
2424
if (!used[i]) {
2525
if (i > 0 && !used[i - 1] && nums[i - 1] == nums[i]) {
26-
/* In case that duplicate permutation with same elemements but in different postions */
26+
/* In case duplicate permutation with same elemements in the same postion */
27+
/* used[i - 1] == true means different level position */
2728
continue;
2829
}
2930
used[i] = true;

0047_permutations_ii/permutations.cc

+7-6
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,29 @@ class Solution {
66
public:
77
vector<vector<int>> permuteUnique(vector<int>& nums) {
88
vector<vector<int>> res;
9-
vector<int> stack;
109
vector<bool> used(nums.size());
1110
sort(nums.begin(), nums.end());
12-
dfs(nums, used, stack, res);
11+
dfs(nums, used, res);
1312
return res;
1413
}
1514

1615
private:
17-
void dfs(vector<int>& nums, vector<bool>& used, vector<int>& stack, vector<vector<int>>& res) {
16+
vector<int> stack;
17+
void dfs(vector<int>& nums, vector<bool>& used, vector<vector<int>>& res) {
1818
if (stack.size() == nums.size()) {
1919
res.push_back(stack);
2020
} else {
2121
for (int i = 0; i < nums.size(); i++) {
2222
// Used marks only allows remaining elements in DFS levels
2323
if (!used[i]) {
2424
if (i > 0 && !used[i - 1] && nums[i - 1] == nums[i]) {
25-
// In case that duplicate permutation with same elemements but in different postions
25+
// In case duplicate permutation with same elemements in the same postion
26+
// used[i - 1] == true means different level position
2627
continue;
2728
}
28-
used[i] = true;
2929
stack.push_back(nums[i]);
30-
dfs(nums, used, stack, res);
30+
used[i] = true;
31+
dfs(nums, used, res);
3132
stack.pop_back();
3233
used[i] = false;
3334
}

0077_combinations/combinations.c

+9-4
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,10 @@ static void dfs(int n, int k, int start, int *stack, int len,
2727
*/
2828
int** combine(int n, int k, int* returnSize, int** returnColumnSizes) {
2929
int capacity = 10000;
30-
int count = 0;
3130
int **results = malloc(capacity * sizeof(int *));
3231
int *stack = malloc(k * sizeof(int));
3332
*returnColumnSizes = malloc(capacity * sizeof(int));
34-
dfs(n, k, 1, stack, 0, results, &count, *returnColumnSizes);
35-
*returnSize = count;
33+
dfs(n, k, 1, stack, 0, results, returnSize, *returnColumnSizes);
3634
return results;
3735
}
3836

@@ -43,8 +41,15 @@ int main(int argc, char **argv)
4341
exit(-1);
4442
}
4543

44+
int n = atoi(argv[1]);
45+
int k = atoi(argv[2]);
46+
if (k > n) {
47+
fprintf(stderr, "n(=%d) must larger than k(=%d)\n", n, k);
48+
exit(-1);
49+
}
50+
4651
int i, j, *col_sizes, count = 0;
47-
int **lists = combine(atoi(argv[1]), atoi(argv[2]), &count, &col_sizes);
52+
int **lists = combine(n, k, &count, &col_sizes);
4853
for (i = 0; i < count; i++) {
4954
for (j = 0; j < col_sizes[i]; j++) {
5055
printf("%d ", lists[i][j]);

0077_combinations/combinations.cc

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,19 @@ class Solution {
66
public:
77
vector<vector<int>> combine(int n, int k) {
88
vector<vector<int>> res;
9-
vector<int> stack;
10-
dfs(n, k, 1, stack, res);
9+
dfs(n, k, 1, res);
1110
return res;
1211
}
1312

1413
private:
15-
void dfs(int n, int k, int start, vector<int>& stack, vector<vector<int>>& res) {
14+
vector<int> stack;
15+
void dfs(int n, int k, int start, vector<vector<int>>& res) {
1616
if (stack.size() == k) {
1717
res.push_back(stack);
1818
} else {
1919
for (int i = start; i <= n; i++) {
2020
stack.push_back(i);
21-
dfs(n, k, i + 1, stack, res);
21+
dfs(n, k, i + 1, res);
2222
stack.pop_back();
2323
}
2424
}

0078_subsets/subsets.cc

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@ class Solution {
66
public:
77
vector<vector<int>> subsets(vector<int>& nums) {
88
vector<vector<int>> res;
9-
vector<int> stack;
10-
dfs(nums, 0, stack, res);
9+
dfs(nums, 0, res);
1110
return res;
1211
}
1312

1413
private:
15-
void dfs(vector<int>& nums, int start, vector<int>& stack, vector<vector<int>>& res) {
14+
vector<int> stack;
15+
void dfs(vector<int>& nums, int start, vector<vector<int>>& res) {
1616
res.push_back(stack);
1717
for (int i = start; i < nums.size(); i++) {
1818
stack.push_back(nums[i]);
19-
dfs(nums, i + 1, stack, res);
19+
dfs(nums, i + 1, res);
2020
stack.pop_back();
2121
}
2222
}

0090_subsets_ii/subsets.cc

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,21 @@ class Solution {
66
public:
77
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
88
vector<vector<int>> res;
9-
vector<int> stack;
109
sort(nums.begin(), nums.end());
11-
dfs(nums, 0, stack, res);
10+
dfs(nums, 0, res);
1211
return res;
1312
}
1413

1514
private:
16-
void dfs(vector<int>& nums, int start, vector<int>& stack, vector<vector<int>>& res) {
15+
vector<int> stack;
16+
void dfs(vector<int>& nums, int start, vector<vector<int>>& res) {
1717
res.push_back(stack);
1818
int last = INT_MIN;
1919
for (int i = start; i < nums.size(); i++) {
2020
if (last != nums[i]) {
21-
/* No duplicate candidate elements at same level position */
21+
/* No duplicate candidate elements in the same level position */
2222
stack.push_back(nums[i]);
23-
dfs(nums, i + 1, stack, res);
23+
dfs(nums, i + 1, res);
2424
stack.pop_back();
2525
}
2626
last = nums[i];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include <stdc++.h>
2+
3+
using namespace std;
4+
5+
class Solution {
6+
public:
7+
vector<vector<int>> combinationSum3(int k, int n) {
8+
vector<vector<int>> res;
9+
dfs(1, 9, k, n, res);
10+
return res;
11+
}
12+
private:
13+
vector<int> stack;
14+
void dfs(int start, int size, int k, int target, vector<vector<int>>& res) {
15+
if (stack.size() == k) {
16+
if (target == 0) {
17+
res.push_back(stack);
18+
}
19+
} else {
20+
for (int i = start; i <= size; i++) {
21+
stack.push_back(i);
22+
dfs(i + 1, size, k, target - i, res);
23+
stack.pop_back();
24+
}
25+
}
26+
}
27+
};

0 commit comments

Comments
 (0)