Skip to content

Commit 8e01f99

Browse files
committed
2 parents 34c60f0 + 0c4216d commit 8e01f99

File tree

6 files changed

+171
-134
lines changed

6 files changed

+171
-134
lines changed

solution/0000-0099/0016.3Sum Closest/README.md

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -317,30 +317,33 @@ class Solution {
317317

318318
#### C
319319

320-
``` C
321-
int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; }
322-
323-
int threeSumClosest(int *nums, int numsSize, int target) {
324-
qsort(nums, numsSize, sizeof(int), cmp);
325-
int closest = nums[0] + nums[1] + nums[2];
326-
327-
for (int i = 0; i < numsSize - 2; i++) {
328-
int j = i + 1, k = numsSize - 1;
329-
while (j < k) {
330-
int sum = nums[i] + nums[j] + nums[k];
331-
if (abs(sum - target) < abs(closest - target)) {
332-
closest = sum;
333-
}
334-
if (sum < target)
335-
j++;
336-
else
337-
k--;
338-
}
339-
}
340-
341-
return closest;
320+
```c
321+
int cmp(const void* a, const void* b) {
322+
return (*(int*) a - *(int*) b);
342323
}
343324

325+
int threeSumClosest(int* nums, int numsSize, int target) {
326+
qsort(nums, numsSize, sizeof(int), cmp);
327+
int ans = 1 << 30;
328+
for (int i = 0; i < numsSize; ++i) {
329+
int j = i + 1, k = numsSize - 1;
330+
while (j < k) {
331+
int t = nums[i] + nums[j] + nums[k];
332+
if (t == target) {
333+
return t;
334+
}
335+
if (abs(t - target) < abs(ans - target)) {
336+
ans = t;
337+
}
338+
if (t > target) {
339+
--k;
340+
} else {
341+
++j;
342+
}
343+
}
344+
}
345+
return ans;
346+
}
344347
```
345348
346349
<!-- tabs:end -->

solution/0000-0099/0016.3Sum Closest/README_EN.md

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -316,30 +316,33 @@ class Solution {
316316

317317
#### C
318318

319-
``` C
320-
int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; }
321-
322-
int threeSumClosest(int *nums, int numsSize, int target) {
323-
qsort(nums, numsSize, sizeof(int), cmp);
324-
int closest = nums[0] + nums[1] + nums[2];
325-
326-
for (int i = 0; i < numsSize - 2; i++) {
327-
int j = i + 1, k = numsSize - 1;
328-
while (j < k) {
329-
int sum = nums[i] + nums[j] + nums[k];
330-
if (abs(sum - target) < abs(closest - target)) {
331-
closest = sum;
332-
}
333-
if (sum < target)
334-
j++;
335-
else
336-
k--;
337-
}
338-
}
339-
340-
return closest;
319+
```c
320+
int cmp(const void* a, const void* b) {
321+
return (*(int*) a - *(int*) b);
341322
}
342323

324+
int threeSumClosest(int* nums, int numsSize, int target) {
325+
qsort(nums, numsSize, sizeof(int), cmp);
326+
int ans = 1 << 30;
327+
for (int i = 0; i < numsSize; ++i) {
328+
int j = i + 1, k = numsSize - 1;
329+
while (j < k) {
330+
int t = nums[i] + nums[j] + nums[k];
331+
if (t == target) {
332+
return t;
333+
}
334+
if (abs(t - target) < abs(ans - target)) {
335+
ans = t;
336+
}
337+
if (t > target) {
338+
--k;
339+
} else {
340+
++j;
341+
}
342+
}
343+
}
344+
return ans;
345+
}
343346
```
344347
345348
<!-- tabs:end -->
Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,26 @@
1-
2-
int cmp(const void* a, const void* b) { return *(int*) a - *(int*) b; }
1+
int cmp(const void* a, const void* b) {
2+
return (*(int*) a - *(int*) b);
3+
}
34

45
int threeSumClosest(int* nums, int numsSize, int target) {
56
qsort(nums, numsSize, sizeof(int), cmp);
6-
int closest = nums[0] + nums[1] + nums[2];
7-
8-
for (int i = 0; i < numsSize - 2; i++) {
7+
int ans = 1 << 30;
8+
for (int i = 0; i < numsSize; ++i) {
99
int j = i + 1, k = numsSize - 1;
1010
while (j < k) {
11-
int sum = nums[i] + nums[j] + nums[k];
12-
if (abs(sum - target) < abs(closest - target)) {
13-
closest = sum;
11+
int t = nums[i] + nums[j] + nums[k];
12+
if (t == target) {
13+
return t;
14+
}
15+
if (abs(t - target) < abs(ans - target)) {
16+
ans = t;
17+
}
18+
if (t > target) {
19+
--k;
20+
} else {
21+
++j;
1422
}
15-
if (sum < target)
16-
j++;
17-
else
18-
k--;
1923
}
2024
}
21-
22-
return closest;
25+
return ans;
2326
}

solution/0000-0099/0017.Letter Combinations of a Phone Number/README.md

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -557,35 +557,44 @@ class Solution {
557557

558558
#### C
559559

560-
``` C
561-
char *map[] = {"", "", "abc", "def", "ghi",
562-
"jkl", "mno", "pqrs", "tuv", "wxyz"};
563-
564-
void backtrack(char *d, int i, char *cur, char **res, int *sz) {
565-
if (!d[i]) {
566-
res[(*sz)++] = strdup(cur);
567-
return;
568-
}
569-
for (char *p = map[d[i] - '0']; *p; p++) {
570-
cur[i] = *p;
571-
backtrack(d, i + 1, cur, res, sz);
572-
}
573-
}
560+
```c
561+
char* d[] = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
574562

575-
char **letterCombinations(char *d, int *sz) {
576-
*sz = 0;
577-
if (!*d)
578-
return NULL;
579-
int max = 1, len = strlen(d);
580-
for (int i = 0; i < len; i++)
581-
max *= (d[i] == '7' || d[i] == '9') ? 4 : 3;
582-
char **res = malloc(max * sizeof(char *)), *cur = malloc(len + 1);
583-
cur[len] = '\0';
584-
backtrack(d, 0, cur, res, sz);
585-
free(cur);
586-
return res;
587-
}
563+
char** letterCombinations(char* digits, int* returnSize) {
564+
if (!*digits) {
565+
*returnSize = 0;
566+
return NULL;
567+
}
588568

569+
int size = 1;
570+
char** ans = (char**) malloc(sizeof(char*));
571+
ans[0] = strdup("");
572+
573+
for (int x = 0; digits[x]; ++x) {
574+
char* s = d[digits[x] - '2'];
575+
int len = strlen(s);
576+
char** t = (char**) malloc(sizeof(char*) * size * len);
577+
int tSize = 0;
578+
579+
for (int i = 0; i < size; ++i) {
580+
for (int j = 0; j < len; ++j) {
581+
int oldLen = strlen(ans[i]);
582+
char* tmp = (char*) malloc(oldLen + 2);
583+
strcpy(tmp, ans[i]);
584+
tmp[oldLen] = s[j];
585+
tmp[oldLen + 1] = '\0';
586+
t[tSize++] = tmp;
587+
}
588+
free(ans[i]);
589+
}
590+
free(ans);
591+
ans = t;
592+
size = tSize;
593+
}
594+
595+
*returnSize = size;
596+
return ans;
597+
}
589598
```
590599

591600
<!-- tabs:end -->

solution/0000-0099/0017.Letter Combinations of a Phone Number/README_EN.md

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -553,35 +553,44 @@ class Solution {
553553

554554
#### C
555555

556-
``` C
557-
char *map[] = {"", "", "abc", "def", "ghi",
558-
"jkl", "mno", "pqrs", "tuv", "wxyz"};
559-
560-
void backtrack(char *d, int i, char *cur, char **res, int *sz) {
561-
if (!d[i]) {
562-
res[(*sz)++] = strdup(cur);
563-
return;
564-
}
565-
for (char *p = map[d[i] - '0']; *p; p++) {
566-
cur[i] = *p;
567-
backtrack(d, i + 1, cur, res, sz);
568-
}
569-
}
556+
```c
557+
char* d[] = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
570558

571-
char **letterCombinations(char *d, int *sz) {
572-
*sz = 0;
573-
if (!*d)
574-
return NULL;
575-
int max = 1, len = strlen(d);
576-
for (int i = 0; i < len; i++)
577-
max *= (d[i] == '7' || d[i] == '9') ? 4 : 3;
578-
char **res = malloc(max * sizeof(char *)), *cur = malloc(len + 1);
579-
cur[len] = '\0';
580-
backtrack(d, 0, cur, res, sz);
581-
free(cur);
582-
return res;
583-
}
559+
char** letterCombinations(char* digits, int* returnSize) {
560+
if (!*digits) {
561+
*returnSize = 0;
562+
return NULL;
563+
}
584564

565+
int size = 1;
566+
char** ans = (char**) malloc(sizeof(char*));
567+
ans[0] = strdup("");
568+
569+
for (int x = 0; digits[x]; ++x) {
570+
char* s = d[digits[x] - '2'];
571+
int len = strlen(s);
572+
char** t = (char**) malloc(sizeof(char*) * size * len);
573+
int tSize = 0;
574+
575+
for (int i = 0; i < size; ++i) {
576+
for (int j = 0; j < len; ++j) {
577+
int oldLen = strlen(ans[i]);
578+
char* tmp = (char*) malloc(oldLen + 2);
579+
strcpy(tmp, ans[i]);
580+
tmp[oldLen] = s[j];
581+
tmp[oldLen + 1] = '\0';
582+
t[tSize++] = tmp;
583+
}
584+
free(ans[i]);
585+
}
586+
free(ans);
587+
ans = t;
588+
size = tSize;
589+
}
590+
591+
*returnSize = size;
592+
return ans;
593+
}
585594
```
586595

587596
<!-- tabs:end -->
Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,37 @@
1-
char* map[] = {"", "", "abc", "def", "ghi",
2-
"jkl", "mno", "pqrs", "tuv", "wxyz"};
1+
char* d[] = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
32

4-
void backtrack(char* d, int i, char* cur, char** res, int* sz) {
5-
if (!d[i]) {
6-
res[(*sz)++] = strdup(cur);
7-
return;
3+
char** letterCombinations(char* digits, int* returnSize) {
4+
if (!*digits) {
5+
*returnSize = 0;
6+
return NULL;
87
}
9-
for (char* p = map[d[i] - '0']; *p; p++) {
10-
cur[i] = *p;
11-
backtrack(d, i + 1, cur, res, sz);
8+
9+
int size = 1;
10+
char** ans = (char**) malloc(sizeof(char*));
11+
ans[0] = strdup("");
12+
13+
for (int x = 0; digits[x]; ++x) {
14+
char* s = d[digits[x] - '2'];
15+
int len = strlen(s);
16+
char** t = (char**) malloc(sizeof(char*) * size * len);
17+
int tSize = 0;
18+
19+
for (int i = 0; i < size; ++i) {
20+
for (int j = 0; j < len; ++j) {
21+
int oldLen = strlen(ans[i]);
22+
char* tmp = (char*) malloc(oldLen + 2);
23+
strcpy(tmp, ans[i]);
24+
tmp[oldLen] = s[j];
25+
tmp[oldLen + 1] = '\0';
26+
t[tSize++] = tmp;
27+
}
28+
free(ans[i]);
29+
}
30+
free(ans);
31+
ans = t;
32+
size = tSize;
1233
}
13-
}
1434

15-
char** letterCombinations(char* d, int* sz) {
16-
*sz = 0;
17-
if (!*d)
18-
return NULL;
19-
int max = 1, len = strlen(d);
20-
for (int i = 0; i < len; i++)
21-
max *= (d[i] == '7' || d[i] == '9') ? 4 : 3;
22-
char **res = malloc(max * sizeof(char*)), *cur = malloc(len + 1);
23-
cur[len] = '\0';
24-
backtrack(d, 0, cur, res, sz);
25-
free(cur);
26-
return res;
35+
*returnSize = size;
36+
return ans;
2737
}

0 commit comments

Comments
 (0)