diff --git a/016_three_sum_closest/Makefile b/016_three_sum_closest/Makefile new file mode 100644 index 0000000..4e07f03 --- /dev/null +++ b/016_three_sum_closest/Makefile @@ -0,0 +1,2 @@ +all: + gcc -O2 -o test three_sum_closest.c -lm diff --git a/016_three_sum_closest/three_sum_closest.c b/016_three_sum_closest/three_sum_closest.c new file mode 100644 index 0000000..f27f231 --- /dev/null +++ b/016_three_sum_closest/three_sum_closest.c @@ -0,0 +1,53 @@ +#include +#include +#include +#include + +static void insert_sort(int *a, int size) +{ + int i, j; + for (i = 1; i < size; i++) { + int tmp = a[i]; + for (j = i - 1; j >= 0 && a[j] > tmp; j--) { + a[j + 1] = a[j]; + } + a[j + 1] = tmp; + } +} + +static int threeSumClosest(int* nums, int numsSize, int target) { + int i, min_diff = INT_MAX; + + if (numsSize < 3) { + return min_diff; + } + + insert_sort(nums, numsSize); + + for (i = 0; i < numsSize - 2; i++) { + int left = i + 1; + int right = numsSize - 1; + while (left < right) { + int diff = nums[i] + nums[left] + nums[right] - target; + if (abs(diff) < abs(min_diff)) { + min_diff = diff; + } + if (diff < 0) { + left++; + } else if (diff > 0) { + right--; + } else { + break; + } + } + } + return min_diff + target; +} + +int main(void) +{ + int i, target = 1; + int nums[] = { -1, 2, 1, -4 }; + printf("%d\n", threeSumClosest(nums, sizeof(nums) / sizeof(nums[0]), target)); + return 0; +}