给定一个包括n个整数的数组nums和一个目标值target。找出nums中的三个整数,使得它们的和与target最接近。返回这三个数的和。假定每组输入只存在唯一答案。
思路
可以借鉴上题的循环方式,双指针法。每次判断三个数之和与target的绝对值是否最小,是最小则返回之和,否则继续遍历。如果三数和小于target,就可以将左指针后移,同理,如果三数和大于target,就可以将右指针前移。
提交代码
import java.util.*;
import static java.lang.Math.min;
public class leetcode {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
String str = scan.nextLine();
int[] nums = new int[n];
for(int i = 0; i < n; i++) {
nums[i] = scan.nextInt();
}
int target = scan.nextInt();
int result= threeSumClosest(nums, target);
System.out.println(result);
}
public static int threeSumClosest(int[] nums, int target) {
int len = nums.length;
Arrays.sort(nums);
int ans = nums[0]+nums[1]+nums[2];
for(int i = 0; i<len; i++) {
int L = i+1;
int R = len-1;
while (L < R) {
int sum = nums[i] + nums[L] + nums[R];
if(Math.abs(ans-target) > Math.abs(sum-target)) {
ans = sum;
}
int diff = sum - target;
if(diff == 0) {
return target;
}
else if (diff < 0) {
L++;
}
else if (diff > 0) {
R--;
}
}
}
return ans;
}
}
小结
纠结了一会初始值为多少,题目应该是确定nums.length>=3的,所以初始值可以为nums[1]+nums[2]+nums[3]