Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 7c2d3db

Browse files
Refine
Signed-off-by: begeekmyfriend <begeekmyfriend@gmail.com>
1 parent 3c3d486 commit 7c2d3db

File tree

7 files changed

+55
-41
lines changed

7 files changed

+55
-41
lines changed

‎039_combination_sum/combination_sum.c‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@ static void dfs(int *nums, int size, int start, int target, int *stack,
66
int len, int **results, int *count, int *column_sizes)
77
{
88
int i;
9-
if (target == 0) {
9+
if (target < 0) {
10+
return;
11+
} else if (target == 0) {
1012
results[*count] = malloc(len * sizeof(int));
1113
memcpy(results[*count], stack, len * sizeof(int));
1214
column_sizes[*count] = len;
1315
(*count)++;
14-
} else if (target>0) {
16+
} else {
1517
for (i = start; i < size; i++) {
1618
stack[len] = nums[i];
19+
/* The elements in solution can be duplicate for the purpose of the problem */
1720
dfs(nums, size, i, target - nums[i], stack, len + 1, results, column_sizes, count);
1821
}
1922
}

‎040_combination_sum_ii/combination_sum.c‎

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,27 @@ static int compare(const void *a, const void *b)
88
return *(int *) a - *(int *) b;
99
}
1010

11-
static void dfs(int *nums, int size, int start, int target, int *solution,intlen,
12-
bool*used, int **results, int *count, int *column_sizes)
11+
static void dfs(int *nums, int size, int start, int target, int *solution,
12+
intlen, int **results, int *count, int *column_sizes)
1313
{
1414
int i;
15-
if (target == 0) {
15+
if (target < 0) {
16+
return;
17+
} else if (target == 0) {
1618
results[*count] = malloc(len * sizeof(int));
1719
memcpy(results[*count], solution, len * sizeof(int));
1820
column_sizes[*count] = len;
1921
(*count)++;
20-
} else if (target > 0) {
22+
} else {
23+
int last = -1;
2124
for (i = start; i < size; i++) {
22-
if (!used[i]) {
23-
if (i > 0 && !used[i - 1] && nums[i - 1] == nums[i]) {
24-
/* Forbid same elements in same level */
25-
/* Used marks allow same elements in different levels */
26-
continue;
27-
}
28-
used[i] = true;
25+
if (last != nums[i]) {
26+
/* No duplicate combinations in different order */
2927
solution[len] = nums[i];
30-
/* i + 1 limits the selecting range in following levels */
31-
dfs(nums, size, i + 1, target - nums[i], solution, len + 1, used, results, count, column_sizes);
32-
used[i] = false;
28+
/* i + 1 limits the candidate range in next levels */
29+
dfs(nums, size, i + 1, target - nums[i], solution, len + 1, results, count, column_sizes);
3330
}
31+
last = nums[i];
3432
}
3533
}
3634
}
@@ -46,11 +44,9 @@ static int** combinationSum(int* candidates, int candidatesSize, int target, int
4644

4745
int *solution = malloc(target * sizeof(int));
4846
int **results = malloc(100 * sizeof(int *));
49-
bool *used = malloc(candidatesSize);
50-
memset(used, false, candidatesSize);
5147
*returnColumnSizes = malloc(100 * sizeof(int));
5248
*returnSize = 0;
53-
dfs(candidates, candidatesSize, 0, target, solution, 0, used, results, returnSize, *returnColumnSizes);
49+
dfs(candidates, candidatesSize, 0, target, solution, 0, results, returnSize, *returnColumnSizes);
5450
return results;
5551
}
5652

‎046_permutations/permutations.c‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,35 @@
33
#include <stdbool.h>
44
#include <string.h>
55

6+
#if 0
67
static void swap(int *a, int *b)
78
{
89
int tmp = *a;
910
*a = *b;
1011
*b = tmp;
1112
}
1213

14+
static void dfs(int *nums, int size, int start,
15+
int **results, int *count, int *col_size)
16+
{
17+
int i;
18+
if (start == size) {
19+
results[*count] = malloc(size * sizeof(int));
20+
memcpy(results[*count], nums, size * sizeof(int));
21+
col_size[*count] = size;
22+
(*count)++;
23+
} else {
24+
for (i = start; i < size; i++) {
25+
/* A swap can make a new permutation but not be listed in order */
26+
swap(nums + start, nums + i);
27+
dfs(nums, size, start + 1, results, count, col_size);
28+
/* restore the array in backtrace */
29+
swap(nums + start, nums + i);
30+
}
31+
}
32+
}
33+
#endif
34+
1335
static void dfs(int *nums, int size, bool *used, int *stack,
1436
int len, int **results, int *count, int *col_size)
1537
{
@@ -22,6 +44,7 @@ static void dfs(int *nums, int size, bool *used, int *stack,
2244
} else {
2345
for (i = 0; i < size; i++) {
2446
if (!used[i]) {
47+
/* */
2548
used[i] = true;
2649
stack[len] = nums[i];
2750
dfs(nums, size, used, stack, len + 1, results, count, col_size);

‎047_permutations_ii/permutations.c‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ static void dfs(int *nums, int size, bool *used, int *stack,
2121
for (i = 0; i < size; i++) {
2222
if (!used[i]) {
2323
if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) {
24-
/* Forbid same elements on same level */
25-
/* Used marks allow same elements in different levels */
24+
/* In case that duplicate permutation with same elemements */
25+
/* Used marks allow same elements in different DFS levels */
2626
continue;
2727
}
2828
used[i] = true;

‎051_n_queens/n_queens.c‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ static void dfs(int n, int row, int *stack, char ***solutions, int *count, int *
6565
if (row == 0 || !conflict(stack, row, col)) {
6666
stack[row] = col;
6767
dfs(n, row + 1, stack, solutions, count, col_sizes);
68-
continue;
6968
}
7069
}
7170
}

‎077_combinations/combinations.c‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ static void dfs(int n, int k, int start, int *stack, int len,
1414
(*count)++;
1515
} else {
1616
for (i = start; i <= n; i++) {
17-
/* No used marks since the order does not matter */
1817
stack[len] = i;
1918
dfs(n, k, i + 1, stack, len + 1, results, count, col_sizes);
2019
}

‎090_subsets_ii/subsets.c‎

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <limits.h>
12
#include <stdio.h>
23
#include <stdlib.h>
34
#include <stdbool.h>
@@ -8,46 +9,39 @@ static inline int compare(const void *a, const void *b)
89
return *(int *) a - *(int *) b;
910
}
1011

11-
static void dfs(int *nums, int size, int start, int *buf,intlevel,
12-
bool*used, int **sets, int *count, int *sizes)
12+
static void dfs(int *nums, int size, int start, int *buf,
13+
intlevel, int **sets, int *count, int *sizes)
1314
{
14-
int i;
15+
int i, last=INT_MIN;
1516
sets[*count] = malloc(level * sizeof(int));
1617
memcpy(sets[*count], buf, level * sizeof(int));
1718
sizes[*count] = level;
1819
(*count)++;
1920
for (i = start; i < size; i++) {
20-
if (!used[i]) {
21-
if (i > 0 && !used[i - 1] && nums[i - 1] == nums[i]) {
22-
/* Forbid same elements on same level */
23-
/* Used marks allow same elements in different levels */
24-
continue;
25-
}
26-
used[i] = true;
21+
if (last != nums[i]) {
22+
/* No duplicate candidate elements at same level position */
2723
buf[level] = nums[i];
28-
/* i + 1 limits the selecting range in following levels */
29-
dfs(nums, size, i + 1, buf, level + 1, used, sets, count, sizes);
30-
used[i] = false;
24+
/* i + 1 limits the selecting range in next levels */
25+
dfs(nums, size, i + 1, buf, level + 1, sets, count, sizes);
3126
}
27+
last = nums[i];
3228
}
3329
}
3430

3531
/**
3632
** Return an array of arrays of size *returnSize.
3733
** The sizes of the arrays are returned as *returnColumnSizes array.
38-
** Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
34+
** Note: Both returned array and *returnColumnSizes array must be malloced, assume caller calls free().
3935
**/
40-
static int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
36+
static int** subsetsWithNoDup(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
4137
{
4238
qsort(nums, numsSize, sizeof(int), compare);
4339
int capacity = 5000;
4440
int **sets = malloc(capacity * sizeof(int *));
4541
int *buf = malloc(numsSize * sizeof(int));
46-
bool *used = malloc(numsSize);
47-
memset(used, false, numsSize);
4842
*returnColumnSizes = malloc(capacity * sizeof(int));
4943
*returnSize = 0;
50-
dfs(nums, numsSize, 0, buf, 0, used, sets, returnSize, *returnColumnSizes);
44+
dfs(nums, numsSize, 0, buf, 0, sets, returnSize, *returnColumnSizes);
5145
return sets;
5246
}
5347

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /