Arrays.sort(nums); int result = nums[0] + nums[1] + nums[2]; int diff = Integer.MAX_VALUE; for (int i = 0; i < nums.length-2; i++){ int left = i + 1; int right = nums.length - 1; while (left < right){ int sum = nums[i] + nums[left] + nums[right]; if (sum < target){ left++; }else if(sum > target){ right--; }else{ result = target; return result; } if (Math.abs(sum -target) < diff){ diff = Math.abs(sum -target); result = sum; } } } return result;
public int threeSumClosest2(int[] nums, int target) { Arrays.sort(nums); int result = nums[0] + nums[1] + nums[2]; int diff = Integer.MAX_VALUE; for (int i = 0; i < nums.length - 2; i++) { if (i > 0 && nums[i] == nums[i-1]) continue; //剪枝去重
int left = i + 1; int right = nums.length - 1; while (left < right) { int sum = nums[i] + nums[left] + nums[right]; if (sum < target) { left++; } else if (sum > target) { right--; } else { result = target; return result; } if (Math.abs(sum - target) < diff) { diff = Math.abs(sum - target); result = sum; } } } return result; }
public int threeSumClosest(int[] nums, int target) { Arrays.sort(nums); int result = nums[0] + nums[1] + nums[2]; int diff = Integer.MAX_VALUE; for (int i = 0; i < nums.length - 2; i++) { if (i > 0 && nums[i] == nums[i - 1]) continue; int left = i + 1; int right = nums.length - 1;
int rangeMin = nums[i] + nums[left] + nums[left + 1]; int rangeMax = nums[i] + nums[right] + nums[right - 1];
if (rangeMin > target) { if (Math.abs(rangeMin - target) < diff) { diff = Math.abs(rangeMin - target); result = rangeMin; } continue; } else if (rangeMax < target) { if (Math.abs(rangeMax - target) < diff) { diff = Math.abs(rangeMax - target); result = rangeMax; } continue; }
while (left < right) { int sum = nums[i] + nums[left] + nums[right]; if (sum < target) { left++; } else if (sum > target) { right--; } else { result = target; return result; } if (Math.abs(sum - target) < diff) { diff = Math.abs(sum - target); result = sum; } } } return result; }