3Sum Closest是3Sum的变种
要求找到最接近的那个结果
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1. The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
1 package com.rust.cal; 2 3 import java.util.Arrays; 4 5 public class ThreeSumClosest { 6 public static int threeSumClosest(int[] nums, int target) { 7 if (nums.length < 3) { 8 return -1; 9 } 10 int closest = Math.abs(nums[0] + nums[1] + nums[2] - target);//find distance 11 Arrays.sort(nums); 12 int len = nums.length; 13 int res = 0;//nums[0] + nums[1] + nums[2]; 14 for (int i = 0; i < len-2; i++) { 15 if (i > 0 && nums[i] == nums[i-1]) continue;//skip this loop 16 int l = i + 1; 17 int r = len - 1; 18 while (l < r) { 19 int sum = nums[l] + nums[r] + nums[i]; 20 if (closest >= Math.abs(sum-target)) { 21 closest = Math.abs(sum-target); 22 res = sum; 23 } 24 if (sum == target) { 25 return sum; 26 } else if (sum - target > 0) { 27 r--; 28 } else { 29 l++; 30 } 31 } 32 } 33 return res; 34 } 35 36 public static void main(String args[]){ 37 int[] nums = {1,2,-10,2,2,0,3,5,5,-5,-6,0}; 38 int[] nums1 = {1,1,1}; 39 System.out.println(threeSumClosest(nums,0)); 40 } 41 }
设立左右两个游标,每次得到结果都和最接近的closest比较一下