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).
这道题和3Sum问题类似。首先肯定要排序,设置一个min记录与target的最接近的sum值。
public class Solution {
public int threeSumClosest(int[] num, int target)
{
if(num.length<3)return target;
quickSort(num,0,num.length-1);
int min = num[0]+num[1]+num[2];
for(int i=0;i<num.length - 2;i++)
{
int start = i + 1;
int end = num.length - 1;
while(start<end)
{
if(num[i] + num[start] + num[end] == target)
{
min = target;
return min;
}
else if(num[i] + num[start] + num[end] >target)
{
if(Math.abs(num[i] + num[start] + num[end] - target)<Math.abs(min-target))
{
min = num[i] + num[start] + num[end];
}
end --;
}
else if(num[i] + num[start] + num[end] <target)
{
if(Math.abs(num[i] + num[start] + num[end] - target)<Math.abs(min-target))
{
min = num[i] + num[start] + num[end];
}
start ++;
}
}
}
return min;
}
public void quickSort(int[] num,int begin,int finish)
{
if(begin<finish)
{
int p = partition(num,begin,finish);
quickSort(num,begin,p-1);
quickSort(num,p+1,finish);
}
}
public int partition(int[] num,int begin,int finish)
{
int value = num[begin];
if(finish - begin == 0)return begin;
while(begin<finish)
{
while(begin<finish&&num[finish]>value)
{
finish --;
}
num[begin] = num[finish];
while(begin<finish&&num[begin]<=value)
{
begin++;
}
num[finish] = num[begin];
}
num[begin] = value;
return begin;
}
}
LeetCode:3Sum Closest,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/jessiading/p/3747201.html