题目描述:
给一个包含n个整数的数组S, 找到和与给定整数target最接近的三元组,返回这三个数的和。
注意事项
只需要返回三元组之和,无需返回三元组本身
样例
例如S = [-1, 2, 1, -4] and target = 1. 和最接近1的三元组是 -1 + 2 + 1 = 2.
1 public class Solution { 2 /** 3 * @param numbers: Give an array numbers of n integer 4 * @param target : An integer 5 * @return : return the sum of the three integers, the sum closest target. 6 */ 7 public int threeSumClosest(int[] numbers ,int target) { 8 // 记录最小的差值 9 long minDiff = Long.MAX_VALUE; 10 // 记录最小差值对应的三个整数和 11 long result = 0; 12 // 每次求得的差值 13 long diff; 14 // 每次求得的三个整数的和 15 long sum; 16 17 // 先对数组进行排序 18 Arrays.sort(numbers); 19 20 21 // i表示假设取第i个数作为结果 22 for (int i = 0; i < numbers.length - 2; i++) { 23 // 第二个数可能的起始位置 24 int j = i + 1; 25 // 第三个数可能是结束位置 26 int k = numbers.length - 1; 27 28 while (j < k) { 29 // 求当前三个数的和 30 sum = numbers[j] + numbers[k] + numbers[i]; 31 // 当前和与目标和之间的差值 32 diff = Math.abs(target - sum); 33 34 // 差值为0就直接返回 35 if (diff == 0) { 36 return (int) sum; 37 } 38 39 // 如果当前的差值比之前记录的差值小 40 if (diff < minDiff) { 41 // 更新最小的差值 42 minDiff = diff; 43 // 更新最小差值对应的和 44 result = sum; 45 46 // 以上的设置在下一次元素处理时生效 47 } 48 49 50 // 和大于target 51 if (sum > target) { 52 k--; 53 } 54 // 和小于target 55 else { 56 j++; 57 } 58 } 59 } 60 61 return (int) result; 62 } 63 }