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).
跟2sum解法类似,先对sum进行排序,循环第一个数,剩下的两个数分别用两个指针分别标记第一个数下一位和最后一个数,根据所得的值sum与target的大小,决定一个指针移动,更新res为与target之差绝对值较小的sum,如果有与target值相等的sum直接返回。 算法复杂度为 排序O(nlogn) + 查找O(n2) = O(n2)
public class Solution { public int threeSumClosest(int[] num, int target) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. Arrays.sort(num); int k=num.length-1; int res=0; int sum=0; boolean flag=true; for(int i=0;i<k;i++){ int j=i+1; while(j<k){ sum=num[i]+num[j]+num[k]; if(flag){ res=sum; flag=false; }else{ if(Math.abs(sum-target)<Math.abs(res-target)) res=sum; } if(sum==target){ res=sum; return res; }else if(sum<target) j++; else k--; } } return res; } }