- 题目详述
给定一个包括 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实现