Given an array nums
of n integers and an integer target
, find three integers in nums
such that the sum is closest to target
. Return the sum of the three integers. You may assume that each input would have exactly one solution.
Example:
Given array nums = [-1, 2, 1, -4], and target = 1. The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
code1:(暴力破解)
public static int threeSumClosest(int[] nums, int target) {
int closest=Integer.MAX_VALUE;
int resultSum=0;
Arrays.sort(nums);
for(int i=0;i<nums.length;i++)
for(int j=i+1;j<nums.length;j++)
for(int k=j+1;k<nums.length;k++)
if(Math.abs(target-nums[i]-nums[j]-nums[k])<closest) {
closest=Math.abs(target-nums[i]-nums[j]-nums[k]);
resultSum=nums[i]+nums[j]+nums[k];
//System.out.println(closest);
}
return resultSum;
}
code2:(优化后的)
public static int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int result=nums[0]+nums[1]+nums[2];
for(int i=0;i<nums.length-2;){
int front=i+1;
int last=nums.length-1;
while(front<last){
int sum=nums[i]+nums[front]+nums[last];
if(sum==target) return sum;
if(Math.abs(sum-target)<Math.abs(target-result))
result=sum;
if(sum>target){
last--;
while(last>front&&nums[last]==nums[last+1]) last--;
}
if(sum<target){
front++;
while(front<last&&nums[front]==nums[front-1]) front++;
}
}
i++;
while(i<nums.length&&nums[i]==nums[i-1])
i++;
}
return result;
}
}