Java版:最接近的三数之和
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
提示:一个nums数组中只有一个最接近的结果
在遇到这个问题的时候我首先想到的方法就是利用:排序 + 双指针 进行遍历
①首先在数组nums中确定第一个数字nums[i]
②在nums[i]之后,两端确立
前指针:start = i + 1; 代表第二个元素的下标
后指针:end = nums.length - 1; 代表第三个元素的下标
③设置一个临时变量sum:利用前后指针移动,三数相加,用临时变量sum保存
④设置一个函数getDistance(int sum, int target)
public int getDistance(int sum,int target) {
return Math.abs(sum - target);//返回三数之和与目标数target的距离
}
展示源码:
// An highlighted block
public class Solution16 {
public static void main(String[]args) {
Solution16 sol = new Solution16();
int[] nums = {1,2,3,4,5};
System.out.println(sol.threeSumClosest(nums, 15));
}
/*
1.思路:
(1)首先固定一个数字nums[i]
(2)在该固定数字nums[i]之后的两端设置两个指针start和end;
(3)设置一个变量sum保存三数之和
(4)判断sum与target的差,如果差最小,则返回sum这个结果
* */
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums); //确定使用Arrays的sort()方法进行升序排序
int closer = nums[0] + nums[1] + nums[2];
for(int i=0;i<nums.length;i++) {
//确定的第一个数
int flag = nums[i];
//开头指针
int start = i+1;
//末尾指针
int end = nums.length-1;
while(start < end) {
int sum = (flag + nums[start] + nums[end]);//用于保存三数之和的变量:sum
if(getDistance(sum,target) < getDistance(closer,target)) {
closer = sum;
}
if(sum > target) {
end--;
}else if(sum < target) {
start++;
}else {
return closer;
}
}
}
return closer;
}
public int getDistance(int sum,int target) {
return Math.abs(sum - target);
}
}