Skip to content

Commit b5ea034

Browse files
Refine
Signed-off-by: begeekmyfriend <begeekmyfriend@gmail.com>
1 parent 7afe0d9 commit b5ea034

File tree

5 files changed

+63
-52
lines changed

5 files changed

+63
-52
lines changed

046_permutations/permutations.c

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,42 @@ static void swap(int *a, int *b)
1010
*b = tmp;
1111
}
1212

13-
static void dfs(int *nums, int size, int start, int **results, int *count)
13+
static void dfs(int *nums, int size, bool *used, int *stack,
14+
int len, int **results, int *count, int *col_size)
1415
{
1516
int i;
16-
if (start == size) {
17+
if (len == size) {
1718
results[*count] = malloc(size * sizeof(int));
18-
memcpy(results[*count], nums, size * sizeof(int));
19+
memcpy(results[*count], stack, size * sizeof(int));
20+
col_size[*count] = size;
1921
(*count)++;
2022
} else {
21-
for (i = start; i < size; i++) {
22-
swap(nums + start, nums + i);
23-
dfs(nums, size, start + 1, results, count);
24-
swap(nums + start, nums + i);
23+
for (i = 0; i < size; i++) {
24+
if (!used[i]) {
25+
used[i] = true;
26+
stack[len] = nums[i];
27+
dfs(nums, size, used, stack, len + 1, results, count, col_size);
28+
used[i] = false;
29+
}
2530
}
2631
}
2732
}
2833

2934
/**
30-
** Return an array of arrays of size *returnSize.
31-
** Note: The returned array must be malloced, assume caller calls free().
32-
**/
33-
static int **permute(int* nums, int numsSize, int* returnSize)
35+
* Return an array of arrays of size *returnSize.
36+
* The sizes of the arrays are returned as *returnColumnSizes array.
37+
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
38+
*/
39+
static int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
3440
{
3541
int count = 0, cap = 5000;
3642
int **results = malloc(cap * sizeof(int *));
43+
bool *used = malloc(numsSize * sizeof(bool));
44+
int *stack = malloc(numsSize * sizeof(int));
3745
*returnSize = 0;
38-
dfs(nums, numsSize, 0, results, returnSize);
46+
*returnColumnSizes = malloc(cap * sizeof(int));
47+
memset(used, false, numsSize * sizeof(bool));
48+
dfs(nums, numsSize, used, stack, 0, results, returnSize, *returnColumnSizes);
3949
return results;
4050
}
4151

@@ -52,7 +62,8 @@ int main(int argc, char **argv)
5262
nums[i] = atoi(argv[i + 1]);
5363
}
5464

55-
int **lists = permute(nums, argc - 1, &count);
65+
int *size;
66+
int **lists = permute(nums, argc - 1, &count, &size);
5667
for (i = 0; i < count; i++) {
5768
for (j = 0; j < argc - 1; j++) {
5869
printf("%d", lists[i][j]);

047_permutations_ii/permutations.c

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,32 +8,34 @@ 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 *stack, int len,
12-
bool *used, int **results, int *count)
11+
static void dfs(int *nums, int size, bool *used, int *stack,
12+
int len, int **results, int *count, int *col_size)
1313
{
1414
int i;
1515
if (len == size) {
1616
results[*count] = malloc(len * sizeof(int));
1717
memcpy(results[*count], stack, len * sizeof(int));
18+
col_size[*count] = size;
1819
(*count)++;
1920
} else {
2021
for (i = 0; i < size; i++) {
2122
if (!used[i]) {
2223
if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) continue;
2324
used[i] = true;
2425
stack[len] = nums[i];
25-
dfs(nums, size, stack, len + 1, used, results, count);
26+
dfs(nums, size, used, stack, len + 1, results, count, col_size);
2627
used[i] = false;
2728
}
2829
}
2930
}
3031
}
3132

3233
/**
33-
** Return an array of arrays of size *returnSize.
34-
** Note: The returned array must be malloced, assume caller calls free().
35-
**/
36-
static int **permute(int* nums, int numsSize, int* returnSize)
34+
* Return an array of arrays of size *returnSize.
35+
* The sizes of the arrays are returned as *returnColumnSizes array.
36+
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
37+
*/
38+
static int **permute(int* nums, int numsSize, int* returnSize, int **returnColumnSize)
3739
{
3840
qsort(nums, numsSize, sizeof(int), compare);
3941

@@ -43,7 +45,8 @@ static int **permute(int* nums, int numsSize, int* returnSize)
4345
bool *used = malloc(numsSize);
4446
memset(used, false, numsSize);
4547
*returnSize = 0;
46-
dfs(nums, numsSize, stack, 0, used, results, returnSize);
48+
*returnColumnSize = malloc(cap * sizeof(int));
49+
dfs(nums, numsSize, used, stack, 0, results, returnSize, *returnColumnSize);
4750
return results;
4851
}
4952

@@ -58,10 +61,10 @@ int main(int argc, char **argv)
5861
int *nums = malloc(count * sizeof(int));
5962
for (i = 0; i < count; i++) {
6063
nums[i] = atoi(argv[i + 1]);
61-
printf("%d\n", nums[i]);
6264
}
6365

64-
int **lists = permute(nums, argc - 1, &count);
66+
int *size;
67+
int **lists = permute(nums, argc - 1, &count, &size);
6568
for (i = 0; i < count; i++) {
6669
for (j = 0; j < argc - 1; j++) {
6770
printf("%d", lists[i][j]);

077_combinations/combinations.c

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include <string.h>
55

66
static void dfs(int n, int k, int start, int *stack, int len,
7-
bool *used, int *col_sizes, int **results, int *count)
7+
int **results, int *count, int *col_sizes)
88
{
99
int i;
1010
if (len == k) {
@@ -14,30 +14,25 @@ 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-
if (!used[i]) {
18-
stack[len] = i;
19-
used[i] = true;
20-
dfs(n, k, i + 1, stack, len + 1, used, col_sizes, results, count);
21-
used[i] = false;
22-
}
17+
/* No used marks since the order does not matter */
18+
stack[len] = i;
19+
dfs(n, k, i + 1, stack, len + 1, results, count, col_sizes);
2320
}
2421
}
2522
}
2623

2724
/**
2825
* Return an array of arrays of size *returnSize.
29-
* The sizes of the arrays are returned as *columnSizes array.
26+
* The sizes of the arrays are returned as *returnColumnSizes array.
3027
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
3128
*/
32-
int** combine(int n, int k, int** columnSizes, int* returnSize) {
29+
int** combine(int n, int k, int* returnSize, int** returnColumnSizes) {
3330
int capacity = 10000;
3431
int count = 0;
3532
int **results = malloc(capacity * sizeof(int *));
3633
int *stack = malloc(k * sizeof(int));
37-
bool *used = malloc((n + 1) * sizeof(bool));
38-
memset(used, false, n + 1);
39-
*columnSizes = malloc(capacity * sizeof(int));
40-
dfs(n, k, 1, stack, 0, used, *columnSizes, results, &count);
34+
*returnColumnSizes = malloc(capacity * sizeof(int));
35+
dfs(n, k, 1, stack, 0, results, &count, *returnColumnSizes);
4136
*returnSize = count;
4237
return results;
4338
}
@@ -50,7 +45,7 @@ int main(int argc, char **argv)
5045
}
5146

5247
int i, j, *col_sizes, count = 0;
53-
int **lists = combine(atoi(argv[1]), atoi(argv[2]), &col_sizes, &count);
48+
int **lists = combine(atoi(argv[1]), atoi(argv[2]), &count, &col_sizes);
5449
for (i = 0; i < count; i++) {
5550
for (j = 0; j < col_sizes[i]; j++) {
5651
printf("%d ", lists[i][j]);

078_subsets/subsets.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include <string.h>
44

55
static void dfs(int *nums, int size, int start, int *buf,
6-
int len, int **sets, int *sizes, int *count)
6+
int len, int **sets, int *count, int *sizes)
77
{
88
int i;
99
sets[*count] = malloc(len * sizeof(int));
@@ -12,23 +12,23 @@ static void dfs(int *nums, int size, int start, int *buf,
1212
(*count)++;
1313
for (i = start; i < size; i++) {
1414
buf[len] = nums[i];
15-
dfs(nums, size, i + 1, buf, len + 1, sets, sizes, count);
15+
dfs(nums, size, i + 1, buf, len + 1, sets, count, sizes);
1616
}
1717
}
1818

1919
/**
2020
** Return an array of arrays of size *returnSize.
21-
** The sizes of the arrays are returned as *columnSizes array.
21+
** The sizes of the arrays are returned as *returnColumnSizes array.
2222
** Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
2323
**/
24-
int** subsets(int* nums, int numsSize, int** columnSizes, int* returnSize)
24+
int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
2525
{
2626
int capacity = 5000;
2727
int **sets = malloc(capacity * sizeof(int *));
2828
int *buf = malloc(numsSize * sizeof(int));
29-
*columnSizes = malloc(capacity * sizeof(int));
29+
*returnColumnSizes = malloc(capacity * sizeof(int));
3030
*returnSize = 0;
31-
dfs(nums, numsSize, 0, buf, 0, sets, *columnSizes, returnSize);
31+
dfs(nums, numsSize, 0, buf, 0, sets, returnSize, *returnColumnSizes);
3232
return sets;
3333
}
3434

@@ -46,7 +46,7 @@ int main(int argc, char **argv)
4646
}
4747
int *sizes;
4848
int count;
49-
int **lists = subsets(nums, size, &sizes, &count);
49+
int **lists = subsets(nums, size, &count, &sizes);
5050
for (i = 0; i < count; i++) {
5151
for (j = 0; j < sizes[i]; j++) {
5252
printf("%d ", lists[i][j]);

090_subsets_ii/subsets.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ static inline int compare(const void *a, const void *b)
99
}
1010

1111
static void dfs(int *nums, int size, int start, int *buf, int level,
12-
bool *used, int **sets, int *sizes, int *count)
12+
bool *used, int **sets, int *count, int *sizes)
1313
{
1414
int i;
1515
sets[*count] = malloc(level * sizeof(int));
@@ -18,31 +18,33 @@ static void dfs(int *nums, int size, int start, int *buf, int level,
1818
(*count)++;
1919
for (i = start; i < size; i++) {
2020
if (!used[i]) {
21-
if (i > 0 && !used[i - 1] && nums[i - 1] == nums[i]) continue;
21+
if (i > 0 && !used[i - 1] && nums[i - 1] == nums[i]) {
22+
continue;
23+
}
2224
used[i] = true;
2325
buf[level] = nums[i];
24-
dfs(nums, size, i + 1, buf, level + 1, used, sets, sizes, count);
26+
dfs(nums, size, i + 1, buf, level + 1, used, sets, count, sizes);
2527
used[i] = false;
2628
}
2729
}
2830
}
2931

3032
/**
3133
** Return an array of arrays of size *returnSize.
32-
** The sizes of the arrays are returned as *columnSizes array.
34+
** The sizes of the arrays are returned as *returnColumnSizes array.
3335
** Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
3436
**/
35-
static int** subsets(int* nums, int numsSize, int** columnSizes, int* returnSize)
37+
static int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
3638
{
3739
qsort(nums, numsSize, sizeof(int), compare);
3840
int capacity = 5000;
3941
int **sets = malloc(capacity * sizeof(int *));
4042
int *buf = malloc(numsSize * sizeof(int));
4143
bool *used = malloc(numsSize);
4244
memset(used, false, numsSize);
43-
*columnSizes = malloc(capacity * sizeof(int));
45+
*returnColumnSizes = malloc(capacity * sizeof(int));
4446
*returnSize = 0;
45-
dfs(nums, numsSize, 0, buf, 0, used, sets, *columnSizes, returnSize);
47+
dfs(nums, numsSize, 0, buf, 0, used, sets, returnSize, *returnColumnSizes);
4648
return sets;
4749
}
4850

@@ -60,7 +62,7 @@ int main(int argc, char **argv)
6062
}
6163
int *sizes;
6264
int count;
63-
int **lists = subsets(nums, size, &sizes, &count);
65+
int **lists = subsets(nums, size, &count, &sizes);
6466
for (i = 0; i < count; i++) {
6567
for (j = 0; j < sizes[i]; j++) {
6668
printf("%d ", lists[i][j]);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy