int cmp (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int threeSumClosest(int* nums, int numsSize, int target) {
int least, max, k, l, r, diff, new_diff, sum, res;
qsort(nums, numsSize, sizeof(int), cmp);
//特殊情况处理
if(numsSize < 3) return 0; //元素个数小于3,直接返回0
least = nums[0] + nums[1] + nums[2]; //可能得到的最小/大值
max = nums[numsSize - 1] + nums[numsSize - 2] + nums[numsSize - 3];
if(target <= least) return least;
if(target >= max) return max;
//普通情况处理
res = least; //初始化res
diff = abs(least - target); //初始化diff
for(k = 0; k < numsSize - 2; ++k){
l = k + 1;
r = numsSize - 1;
while(l < r){
sum = nums[k] + nums[l] + nums[r];
new_diff = abs(sum - target);
if(new_diff == 0) return target; //得到最优,直接返回
if(new_diff < diff){ //得到更优数据,更新
diff = new_diff;
res = sum;
}
if(sum < target){ //比目标值小,l指针右移
++l;
}
else if(sum > target){ //比目标值大,r指针左移
--r;
}
}
}
return res;
}
{
return ( *(int*)a - *(int*)b );
}
int threeSumClosest(int* nums, int numsSize, int target) {
int least, max, k, l, r, diff, new_diff, sum, res;
qsort(nums, numsSize, sizeof(int), cmp);
//特殊情况处理
if(numsSize < 3) return 0; //元素个数小于3,直接返回0
least = nums[0] + nums[1] + nums[2]; //可能得到的最小/大值
max = nums[numsSize - 1] + nums[numsSize - 2] + nums[numsSize - 3];
if(target <= least) return least;
if(target >= max) return max;
//普通情况处理
res = least; //初始化res
diff = abs(least - target); //初始化diff
for(k = 0; k < numsSize - 2; ++k){
l = k + 1;
r = numsSize - 1;
while(l < r){
sum = nums[k] + nums[l] + nums[r];
new_diff = abs(sum - target);
if(new_diff == 0) return target; //得到最优,直接返回
if(new_diff < diff){ //得到更优数据,更新
diff = new_diff;
res = sum;
}
if(sum < target){ //比目标值小,l指针右移
++l;
}
else if(sum > target){ //比目标值大,r指针左移
--r;
}
}
}
return res;
}