這題重點在於先排序,排序頂多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;
}
}