求最接近的3sum,当然也是可以equal的。有了上一题的基础,这次只需要设置一个变量存储每次比较中较小的值就行,双重循环后即得出所求值。依然要先排序。
如下:
void SortThreeSum(int num[], int n, int l, int h)
{
if (l >= h)
return;
int low = l, high = h;
int temp = num[low];
while (low < high) {
while (temp < num[high] && low < high)
high--;
num[low] = num[high];
while (temp >= num[low] && low < high)
low++;
num[high] = num[low];
}
num[low] = temp;
SortThreeSum(num, n, l, low - 1);
SortThreeSum(num, n, low + 1, h);
}
int threeSumClosest(int* nums, int numsSize, int target) {
if (numsSize < 3)
return 0;
SortThreeSum(nums, numsSize, 0, numsSize - 1);
int result = 10240;
int low = 0, high = 0;
int tango = 0;
int stepa = 0, stepb = 0;
for (int i = 0; i < numsSize - 2; i++) {
while (nums[i] == nums[i - 1] && i > 0)
i++;
low = i + 1, high = numsSize - 1;
while (low < high) {
tango = nums[i] + nums[low] + nums[high];
if (tango < target) {
low++;
}
else if (tango > target) {
high--;
while (nums[high] == nums[high + 1])
high--;
}
else if (tango == target) { //Equal
result = tango;
return result;
}
stepa = abs(target - result);
stepb = abs(target - tango);
if (stepb <= stepa)
result = tango;
}
}
return result;
}