给一个包含 n 个整数的数组 S, 找到和与给定整数 target 最接近的三元组,返回这三个数的和。
注意事项
只需要返回三元组之和,无需返回三元组本身
样例
注意事项
只需要返回三元组之和,无需返回三元组本身
样例
例如 S = [-1, 2, 1, -4] and target = 1. 和最接近 1 的三元组是 -1 + 2 + 1 = 2.
import java.util.Arrays;
import java.util.Scanner;
/**
* 给一个包含 n 个整数的数组 S, 找到和与给定整数 target 最接近的三元组,返回这三个数的和。
注意事项
只需要返回三元组之和,无需返回三元组本身
样例
例如 S = [-1, 2, 1, -4] and target = 1. 和最接近 1 的三元组是 -1 + 2 + 1 = 2.
*
* @author Dell
*
*/
public class Test59 {
public static int threeSumClosest(int[] numbers,int target)
{
int dis=Integer.MAX_VALUE;
int result=0;
Arrays.sort(numbers);
for(int i=0;i<numbers.length-2;i++)
{
int newtarget=target-numbers[i];
int tempresult=twoSum(numbers,newtarget, i+1,numbers.length-1);
if(Math.abs(newtarget-tempresult)<dis)
{
dis=Math.abs(newtarget-tempresult);
result=tempresult+numbers[i];
if(result==target)
{
return result;
}
}
}
return result;
}
public static int twoSum(int[] numbers,int target,int start, int end)
{
int dis=Integer.MAX_VALUE;
int result=0;
while(start<end)
{
if(numbers[start]+numbers[end]>target)
{
if(numbers[start]+numbers[end]-target<dis)
{
dis=numbers[start]+numbers[end]-target;
result=numbers[start]+numbers[end];
}
end--;
}
else if(numbers[start]+numbers[end]<target)
{
if(target-numbers[start]-numbers[end]<dis)
{
dis=numbers[start]+numbers[end]-target;
result=numbers[start]+numbers[end];
}
start++;
}
else
{
result=target;
}
}
return result;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] a=new int[n];
for(int i=0;i<a.length;i++)
{
a[i]=sc.nextInt();
}
int target=sc.nextInt();
System.out.println(threeSumClosest(a,target));
}
}