给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
public class ThreeSumClosest {

	public static void main(String[] args) {
		int[] nums = { -1, 2, 1, -4 };
		System.out.println(threeSumClosest(nums, 1)); // 2
	}

	public static int threeSumClosest(int[] nums, int target) {
		int closestSum = 0, diff = Integer.MAX_VALUE; // 初始化最接近的三个数的和 及 与目标值的差值(绝对值)
		Arrays.sort(nums); // 对数组排序
		for (int k = 0; k < nums.length - 2; k++) { // 第一个数的索引
			int i = k + 1, j = nums.length - 1; // 第二个和第三个数的索引
			while (i < j) {
				int sumTemp = nums[k] + nums[i] + nums[j]; // 当前的三数之和
				int diffTemp = Math.abs(target - sumTemp); // 当前三数之和与目标值差值的绝对值
				if (diffTemp < diff) { // 如果差值绝对值小于之前的,则更新最接近的三个数的和 及 与目标值的差值(绝对值)
					closestSum = sumTemp;
					diff = diffTemp;
				}
				if (sumTemp > target) { // 如果三数之和大于目标值,则减小最大的第三个数
					j--;
				} else if (sumTemp < target) { // 如果三数之和小于目标值,则增大的第二个数
					i++;
				} else {
					return target; // 如果和目标值相等,那当然就是最接近的三数之和了
				}
			}
		}
		return closestSum;
	}

}