LeetCode-16. 最接近的三数之和
题目来源
题目详情
给你一个长度为 n
的整数数组 nums
和 一个目标值 target
。请你从 nums
中选出三个整数,使它们的和与 target
最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
示例 1:
输入: nums = [-1,2,1,-4], target = 1
输出: 2
解释: 与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
示例 2:
输入: nums = [0,0,0], target = 1
输出: 0
提示:
3 <= nums.length <= 1000
-1000 <= nums[i] <= 1000
-104 <= target <= 104
相似题目
题解分析
解法一:双指针法
- 与LeetCode-15.三数之和这题十分相似,本题是需要求解三数之和,并求出满足条件的三个数。
- 我们可以通过设置三个指针a,b,c分别指向数组中的三个数,并且通过移动这三个指针来寻找满足条件的可能组合。其实,三数之和问题的一个最简单题目是两数之和。两数之和其实很简单,通过首先对数组进行排序,然后设置两个指针,分别指向数组头尾,并且根据两数和与target的大小来移动指针就可以找到所有满足条件的组合。
- 在本题中,与两数之和问题不同的是,我们这里有三个指针,为了不遗漏的找到所有满足条件的组合,我们可以先固定a指针,然后使用类似于两数之和中使用的方法,分别从头尾指针开始往数组中间靠拢来寻找满足条件的三数组合。
- 此外,与三数之和题目不同的一点是,我们这里并不是找target,而是寻找距target最近的三数组合方案,所以,我们需要对之前的方案进行小的改进,也就是需要使用Math的abs函数寻找绝对值最小的可能组合。
class Solution {
public int threeSumClosest(int[] nums, int target) {
int minans = Integer.MAX_VALUE;
int ans = 0;
int len = nums.length;
Arrays.sort(nums);// 对数组进行排序
for(int a = 0; a<len; a++){
int c = len - 1;
int leave = target - nums[a];
for(int b = a + 1; b<len; b++){
while(b < c && nums[b] + nums[c] > leave){
if(Math.abs(target - nums[a] - nums[b] - nums[c]) < minans){
minans = Math.abs(target - nums[a] - nums[b] - nums[c]);
ans = nums[a] + nums[b] + nums[c];
}
c--;
}
if(b == c){
break;
}
if(Math.abs(target - nums[a] - nums[b] - nums[c]) < minans){
minans = Math.abs(target - nums[a] - nums[b] - nums[c]);
ans = nums[a] + nums[b] + nums[c];
}
}
}
return ans;
}
}
Either Excellent or Rusty