难度:中等
目录
一、问题描述
这里直接采用的是leetcode上面的问题描述。
给你一个长度为 n
的整数数组 nums
和 一个目标值 target
。请你从 nums
中选出三个整数,使它们的和与 target
最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
下面给出示例:
提示:
3 <= nums.length <= 1000
-1000 <= nums[i] <= 1000
-104 <= target <= 104
二、解题思想
这一题和LeetCode的15题三数之和非常相似,有兴趣的可以看一看上一题的题解。15.三数之和-LeetCodehttps://blog.csdn.net/XUELEIQIANQIU/article/details/122522304?spm=1001.2014.3001.5501 个人认为,上一题的难度要比这一题简单,上一题还要判断重复的解的情况,这题则没有。思想上大致是相似的,使用的是双指针+排序的方法来解题的。
这里将指针移动的条件改为了:(sum为当前三数之和)
- sum > target,尾指针--
- sum <= target, 头指针++
这里求得是距离最近得三数之和,我们需要将 sum 和 target 得距离与上次求得 ans 和 target得距离进行比较,如果 sum 和 target 得距离小于 ans 和 target 得距离 则更新答案 ans。
三、解题
1、判断极端情况
这里没有什么极端情况,注意指针不要越界就好了。
2、代码实现
int distance(int i, int j){
return max(i,j)-min(i,j);
}
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
//初始化答案 为排过序的前三个元素的和
int ans = nums[0] + nums[1] + nums[2];
for(int i = 0; i < nums.size()-2; i++){
int headPointer = i + 1;
int tailPointer = nums.size() - 1;
while(headPointer != tailPointer){
int sum = nums[i] + nums[headPointer] + nums[tailPointer];
if(distance(sum,target) < distance(target,ans)){
ans = sum;
}else if(sum > target){
tailPointer--;
}
else if(sum <= target){
headPointer++;
}
}
}
return ans;
}
以上就是对于本题,我查看资料以及自己思考所编写出来得题解,如果有更好的方法,欢迎大家在下方留言,一起讨论。👇👇