public class Solution16 {
|
|
|
|
public int threeSumClosest(int[] nums, int target) {
|
|
Arrays.sort(nums);
|
|
// 当前最近的和
|
|
int closestSum = nums[0] + nums[1] + nums[nums.length - 1];
|
|
for (int i = 0; i < nums.length - 2; i++) {
|
|
if (i == 0 || nums[i] != nums[i - 1]) {
|
|
// 左指针
|
|
int left = i + 1;
|
|
// 右指针
|
|
int right = nums.length - 1;
|
|
// 判断是否遍历完了
|
|
while (left < right) {
|
|
// 当前的和
|
|
int sum = nums[i] + nums[left] + nums[right];
|
|
// 小优化,相等就略过了
|
|
while (left < right && nums[left] == nums[left + 1]) {
|
|
left++;
|
|
}
|
|
while (left < right && nums[right] == nums[right - 1]) {
|
|
right--;
|
|
}
|
|
// 这里判断,其实也还是希望趋近目标值
|
|
if (sum < target) {
|
|
left++;
|
|
} else {
|
|
right--;
|
|
}
|
|
// 判断是否需要替换
|
|
if (Math.abs(sum - target) < Math.abs(closestSum - target)) {
|
|
closestSum = sum;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return closestSum;
|
|
}
|
|
}
|