题目
- 给定一个包括 n 个整数的数组
nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
- 例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
方法
class Solution {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
if(nums.length<3){
return 0;
}
int min =nums[0]+nums[1]+nums[2];
for(int first =0 ;first<nums.length-1;first++){
int mid =first+1;
int last = nums.length-1;
while(mid<last){
int sum =nums[first]+nums[mid]+nums[last];
if(Math.abs(target-sum)<Math.abs(target-min)){
min= sum;
}
if(sum>target){
last--;
}else if (sum<target){
mid++;
}else {
return min;
}
}
}
return min;
}
}
思路
- 对数组进行排序,固定一个数
first
,这样就转化为在固定遍历数内找两数mid
,last
看看是三数之和是否满足条件
- 设置瞄点为:
min =nums[0]+nums[1]+nums[2];
用于后面的不断的通过比较缩小与target的距离
- 循环遍历first这个数,初始化三个数,
first=0;mid =first+1 ,last =nums.length-1;sum =first+mid+last;
- 不断更新sum值,通过
if abs(target-sum)<abs(target-min)min= sum;
- 比较选出来的三个数之和
sum
与target
的距离,如果小于,则mid++
,大于则last--
。等于则返回sum
;
4.循环内同时判断 sum
与 target
的大小关系,因为数组有序,如果 sum > target
则 end--
,如果 sum < target
则 start++
,如果 sum == target 则说明距离为 0 直接返回min
- 返回
min
值
下一步总结
- 瞄点的设置可用于需要比较更新同一值时的情况,作为更新值的比较对象而出现。可初始化瞄点为某固定值