时间复杂度O(n²logn)
先排序,再枚举前两个数,二分找可能产生最佳答案的第三个数,尝试更新答案。
16. 最接近的三数之和
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int tip=nums.size();
int a[tip+5];
for (int i=0;i<tip;i++) a[i]=nums[i];
sort(a,a+tip);
int help,l,r,mid;
int tmp;
int ans=-100000000;
for (int i=0;i<tip;i++){
for (int j=i+1;j<tip-1;j++){
help=target-a[i]-a[j];
//二分找最接近的数
if (a[tip-1]>help){
l=j+1;
r=tip-1;
while (l<r){
mid=(l+r)/2;
if (a[mid]>help) r=mid;
else l=mid+1;
}
}
else l=tip-1;
tmp=a[i]+a[j]+a[l];
if (abs(tmp-target)<abs(ans-target)){
ans=tmp;
}
if ((l-1)!=j){
tmp=a[i]+a[j]+a[l-1];
if (abs(tmp-target)<abs(ans-target)){
ans=tmp;
}
}
}
}
return ans;
}
};