和15题的方法相近,就是通过绝对值找到最近的数字,时间附加度依然是O(n2)。
class Solution {
public int threeSumClosest(int[] nums, int target) {
int closest = nums[0] + nums[1] + nums[2];
Arrays.sort(nums);
for(int i = 0; i< nums.length-2; i++){
if (i > 0 && nums[i] == nums[i - 1]) continue;// skip save value
for(int j = i + 1, k = nums.length - 1; j < k;){ // j for nearst value, k for biggest value
int sum = target - nums[i];
if (nums[j] + nums[k] == sum) return target;
if ( nums[j] + nums[k] > sum) {
while(j < k && nums[j] + nums[k] > sum ) --k;
closest = (Math.abs(sum - nums[j] - nums[k+1]) < Math.abs(target - closest)) ?
nums[i]+nums[j]+nums[k+1] : closest;
} else{
while(j < k && nums[j] + nums[k] < sum ) ++j;
closest = (Math.abs(sum - nums[j-1] - nums[k]) < Math.abs(target - closest)) ?
nums[i]+nums[j-1]+nums[k] : closest;
}
}
}
return closest;
}
}