Skip to content

Commit e3e9620

Browse files
committed
[0018 fourSum]add C version
add C version for 0018: fourSum problem Signed-off-by: liao junwu <[email protected]>
1 parent 7fc8aa1 commit e3e9620

File tree

1 file changed

+90
-0
lines changed

1 file changed

+90
-0
lines changed

problems/0018.四数之和.md

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,96 @@ if (nums[k] + nums[i] > target && nums[i] >= 0) {
151151

152152
## 其他语言版本
153153

154+
### C:
155+
156+
```C
157+
/* qsort */
158+
static int cmp(const void* arg1, const void* arg2) {
159+
int a = *(int *)arg1;
160+
int b = *(int *)arg2;
161+
return (a > b);
162+
}
163+
164+
int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes) {
165+
166+
/* 对nums数组进行排序 */
167+
qsort(nums, numsSize, sizeof(int), cmp);
168+
169+
int **res = (int **)malloc(sizeof(int *) * 40000);
170+
int index = 0;
171+
172+
/* k */
173+
for (int k = 0; k < numsSize - 3; k++) { /* 第一级 */
174+
175+
/* k剪枝 */
176+
if ((nums[k] > target) && (nums[k] >= 0)) {
177+
break;
178+
}
179+
/* k去重 */
180+
if ((k > 0) && (nums[k] == nums[k - 1])) {
181+
continue;
182+
}
183+
184+
/* i */
185+
for (int i = k + 1; i < numsSize - 2; i++) { /* 第二级 */
186+
187+
/* i剪枝 */
188+
if ((nums[k] + nums[i] > target) && (nums[i] >= 0)) {
189+
break;
190+
}
191+
/* i去重 */
192+
if ((i > (k + 1)) && (nums[i] == nums[i - 1])) {
193+
continue;
194+
}
195+
196+
/* left and right */
197+
int left = i + 1;
198+
int right = numsSize - 1;
199+
200+
while (left < right) {
201+
202+
/* 防止大数溢出 */
203+
long long val = (long long)nums[k] + nums[i] + nums[left] + nums[right];
204+
if (val > target) {
205+
right--;
206+
} else if (val < target) {
207+
left++;
208+
} else {
209+
int *res_tmp = (int *)malloc(sizeof(int) * 4);
210+
res_tmp[0] = nums[k];
211+
res_tmp[1] = nums[i];
212+
res_tmp[2] = nums[left];
213+
res_tmp[3] = nums[right];
214+
res[index++] = res_tmp;
215+
216+
/* right去重 */
217+
while ((right > left) && (nums[right] == nums[right - 1])) {
218+
right--;
219+
}
220+
/* left去重 */
221+
while ((left < right) && (nums[left] == nums[left + 1])) {
222+
left++;
223+
}
224+
225+
/* 更新right与left */
226+
left++, right--;
227+
}
228+
}
229+
}
230+
}
231+
232+
/* 返回值处理 */
233+
*returnSize = index;
234+
235+
int *column = (int *)malloc(sizeof(int) * index);
236+
for (int i = 0; i < index; i++) {
237+
column[i] = 4;
238+
}
239+
*returnColumnSizes = column;
240+
return res;
241+
}
242+
```
243+
154244
### Java:
155245
156246
```Java

0 commit comments

Comments
 (0)