class Solution {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int start = 0;
int left = 1;
int right = nums.length - 1;
int min = nums[left] + nums[right] + nums[start];
for(;start < nums.length -2 ; start++) {
left = start + 1;
right = nums.length - 1;
while(left < right) {
if(nums[left] + nums[right] + nums[start] == target) {
return target;
}else if(left < right) {
if(Math.abs(nums[left] + nums[right] + nums[start] - target) < Math.abs(target - min)) {
min = nums[left] + nums[right] + nums[start];
}
if(left < right -1) {
int labs = Math.abs(nums[left + 1] + nums[right] + nums[start] - target);
int rabs = Math.abs(nums[left] + nums[right - 1] + nums[start] - target);
if(labs < rabs) {
left++;
}else {
right--;
}
}else {
left++;
}
}
}
}
return min;
}
}
踩坑点: 最后不要忘记left++,否则会进入死循环
优化:
// 区间[left,right]内,和最小的值
int rangeMin = nums[k] + nums[left] + nums[left + 1];
// 区间[left,right]内,和最大的值
int rangeMax = nums[k] + nums[right] + nums[right - 1];
if (rangeMin > target) {
// 区间最小值比目标大, 没必要寻找区间其他值的和了
if (rangeMin - target < min) {
min = rangeMin - target;
result = rangeMin;
}
} else if (rangeMax < target) {
// 区间最大的值比目标还要小,也没必要寻找区间其他值的和了
if (target - rangeMax < min) {
min = target - rangeMax;
result = rangeMax;
}
}
作者:tenlee
链接:https://leetcode-cn.com/problems/3sum-closest/solution/shuang-zhi-zhen-fa-you-hua-java-2msji-bai-100-by-t/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。