题目大意是传入一个包含多个整数的数组A以及一个目标值target,并从中挑选三个整数(拥有不同的下标),使得三个整数的加总sum距离target最小(abs(sum - target))最小,返回这样的sum。
3Sum的姊妹篇,就不再做详细说明,可以参考我之前写的这篇文章:Leetcode:3Sum。
对3Sum的代码稍作修改就得到了最终的代码:
1 package cn.dalt.leetcode; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.Collections; 6 import java.util.List; 7 8 /** 9 * Created by dalt on 2017/6/19. 10 */ 11 public class ThreeSumClosest { 12 public static void main(String[] args) { 13 System.out.println(new ThreeSum().threeSum(new int[]{})); 14 } 15 16 public int threeSumClosest(int[] nums, int target) { 17 if (nums.length < 3) { 18 return 0; 19 } 20 Arrays.sort(nums); 21 int n = nums.length; 22 List<List<Integer>> result = new ArrayList<>(); 23 int best = nums[0] + nums[1] + nums[2]; 24 int offset = Math.abs(best - target); 25 for (int i = 0, bound = n - 2; i < bound; i++) { 26 if (i > 0 && nums[i] == nums[i - 1]) { 27 continue; 28 } 29 int l = i + 1; 30 int r = n - 1; 31 while (l < r) { 32 int sum = nums[i] + nums[l] + nums[r]; 33 int dist = Math.abs(sum - target); 34 if (dist < offset) { 35 best = sum; 36 offset = dist; 37 } 38 if (sum < target) { 39 l++; 40 } else if (sum > target) { 41 r--; 42 } else { 43 return target; 44 } 45 } 46 } 47 return best; 48 } 49 }