这题重点在于先排序,排序顶多O(n^2),然后后面控制第一个,对让第二三个分别位于数组两边往中间夹,也是 O(n^2),加起来O(n^2)。如果暴力破解的话三个for循环就要O(n^3)了
class Solution {
public int threeSumClosest(int[] nums, int target)
{
Arrays.sort(nums);//java自带快排
int closestSum =nums[0]+nums[1]+nums[nums.length-1];
int sum;
for(int i=0;i<=nums.length-3;i++)//减3因为最后三个数
{
int start=i+1;//第二个数的指针从i后一位开始
int end=nums.length-1;//第三个数的指针从最后一位开始
while(start<end)
{
sum=nums[i]+nums[start]+nums[end];
//如果sum比target小,那么让sum大一点,即start加1
if(sum<target)
{
start=start+1;
}
//如果sum比target小,那么让sum大一点,即start加1
else if(sum>target)
{
end=end-1;
}
//一样可以直接输出,因为题目假定唯一最近
else
{
return sum;
}
//sum要比closestSum离target更近,才能更新cloestSum
if(Math.abs(sum-target)<Math.abs(closestSum-target))
{
closestSum=sum;
}
}
}
return closestSum;
}
}