和15题基本一致,if else分支记得改为判断当前这一组三元素和(记为sum)和target差值的绝对值大小,更小则更新结果。由于向内收缩可能不断更新解,所以while条件用low<high就行了,不用停止直到高低位相遇。
贴代码:
public class threeClosest {
public static int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int result = nums[0]+nums[1]+nums[2], sum = result;
if( nums.length == 3 ) return result;
int sub = Math.abs(result-target), subR = sub;//初始化结果
for(int i = 0; i < nums.length - 2; i++) {
if( i == 0 || nums[i] != nums[i-1]) {
int low = i+1, high = nums.length-1;
while( low < high ) {
sum = nums[i]+nums[low]+nums[high];//sum指代的是这三个数的和
subR = Math.abs( sum-target );
if( sum < target ) {
if( subR < sub ) {
sub = subR; result = sum;
}
low++;
}
else if( sum > target ) {
if( subR < sub ) {
sub = subR; result = sum;
}
high--;
}
else {
return target;
}
}
}
}
return result;
}
}