二、最接近的三数之和
1、题目描述
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
2、题目示例
3、分析
这道题目和三数之和简直不能太像了,我们还是同样的思路,三指针暴力穷举,只不过我们需要加一个待定返回值ret,当有更接近target的三数之和出现的时候,我们要对这个数ret更新,其余要比三数之和简单多了,因为题目告诉我们必定有解,那么我们连特殊情况都不需要考虑。
4、上代码
int cmp(const void* x,const void* y) { return *(int*)x-*(int*)y; } int threeSumClosest(int* nums, int numsSize, int target) { qsort(nums,numsSize,sizeof(int),cmp); int i=0; int ret=nums[0]+nums[1]+nums[2]; for(int i=0;i<numsSize;++i) { int left=i+1; int right=numsSize-1; while(left<right) { int sum=nums[i]+nums[left]+nums[right]; if(abs(ret-target)>abs(sum-target)) ret=sum; if(sum==target) return sum; else if(sum>target) right--; else left++; } } //更新最近的 return ret; }
这里博主借用了一个abs函数,这个函数主要是为了求绝对值。
它的头文件是(math.h).
最后,推荐给大家一款神器,相信大家在刷题的时候经常遇到一个问题:我代码和答案一模一样,为啥会出错?我是不是废了?怎么也看不出来,
那么,推荐大家一款对比代码的神器App,在软件管家就可以免费下载: