题目描述:给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
这题和三数之和有着异曲同工之妙
算法分析
- 首先是特别判断,如果数组为空,或者数组小于三个数,则返回0.
- 排序数组
- 初始化一个ans表示最初的三数之和,然后循环选定一个下标从0到numsSize-1的数,每次循环中,使用双指针,左边界l,右边界r,进入while(l<r),定义sum表示新的三数之和,如果初始化的ans和target的差值比target和sum的差值大,ans更新为sum,如果sum>目标值,说明右边界值偏大,
r- -,如果sum<目标值,说明左边界偏小,l++;如果sum=target,可得ans=sum,最接近,直接返回ans。
C语言实现
int cmp(const void *a, const void *b)
{
return *(int*)a - *(int*)b;
}
int threeSumClosest(int* nums, int numsSize, int target){
int i,j;
if(nums==NULL||numsSize<3)
return 0;
qsort(nums,numsSize,sizeof(nums[0]),cmp);
int ans=nums[0]+nums[1]+nums[2];
for(i=0;i<numsSize;i++)
{
int l=i+1;
int r=numsSize-1;
while(l<r)
{
int sum=nums[l]+nums[r]+nums[i];
if(abs(target-ans)>abs(target-sum))
ans=sum;
else if(sum>target)
r--;
else if(sum<target)
l++;
else
return ans;
}
}
return ans;
}
java实现
class Solution {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int ans = nums[0] + nums[1] + nums[2];
for(int i=0;i<nums.length;i++) {
int start = i+1, end = nums.length - 1;
while(start < end) {
int sum = nums[start] + nums[end] + nums[i];
if(Math.abs(target - sum) < Math.abs(target - ans))
ans = sum;
if(sum > target)
end--;
else if(sum < target)
start++;
else
return ans;
}
}
return ans;
}
}