- 題目詳述
給定一個包括 n 個整數的數組 nums 和 一個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。
例如,給定數組 nums = [-1,2,1,-4], 和 target = 1.
與 target 最接近的三個數的和爲 2. (-1 + 2 + 1 = 2).
二.自我探尋
思路 :結合了雙指針在排序數組線性搜索的思路
先排序O(nlogn)
然後循環一遍數組,在循環到某個數的同時,雙指針搜索其後面數組的兩數之和,保存最少與target最小差別的 時間複雜度O(n的平方)
代碼:public int threeSumClosest(int[] nums, int target) {
int q=0;
for(int t=0;t<nums.length;t++)
{
int i=t+1;
int j=nums.length-1;
if(t==0)
q=nums[i]+nums[j]+nums[t];
while(i<j)
{
int twosum=nums[i]+nums[j];
if(twosum-target+nums[t]==0)
{
return twosum+nums[t];
}
else if(twosum-target+nums[t]>0)
{
j--;
}
else
i++;
if(Math.abs(twosum-target+nums[t])<Math.abs(q-target))
{
q=twosum+nums[t];
}
}
}
return q;
}
評價;
三.網絡學習過程
哭泣..原來是不知道怎麼快時間的算法
看到了9ms的算法 與我思路完全一樣 但快了好多…爲什麼?難道是函數原因?
For循環 循環到倒數第三位即可
代碼(與上面思路完全一樣):
class Solution {
public int threeSumClosest(int[] nums, int target) {
int n=nums.length;
Arrays.sort(nums);
int ans=Integer.MAX_VALUE,rus=Integer.MAX_VALUE;
for(int i=0;i<n-2;i++)
{
if(i>0&&nums[i]==nums[i-1]) continue;
int j=i+1;
int k=n-1;
while(j<k)
{
int sum=nums[i]+nums[j]+nums[k];
if(sum==target)
return sum;
else if(sum>target)
{
if(sum-target<ans)
{
ans=sum-target;
rus=sum;
}
k--;
}
else
{
if(target-sum<ans)
{
ans=target-sum;
rus=sum;
}
j++;
}
}
}return rus;
}
}
四.Python實現