题目:
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
题解:
首先,暴力法O(N^3),对于无序数组采取暴力法,我们对该解法进行优化,首先,有序的数组更加方便我们进行查找等操作,所以先对数组快速排序O(N*logN),接下来有两条路可选。
方法一: O(N^2)进行两重循环,将所有两个数的组合按序存储下来,然后对原来数组中的每一个元素进行二分查询O(NlogN *N),总时间复杂度O(N * N)。
方法二: 先固定一个数,题目转化为找到2个数的和到target-nums[i]最近,双指针法O(N)即可找到,总复杂度O(N *N),空间复杂度较第一种更好。
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int ans;
int n=nums.size();
int mmin=INT_MAX;
for(int i=0;i<n;i++)
{
int pb=i+1,pc=n-1;
while(pb<pc)
{
int sum=nums[pb]+nums[pc]+nums[i];
if(sum==target) return target;
else if(sum>target)
{
if(abs(sum-target)<mmin)
{
ans=sum;
mmin=abs(sum-target);
}
pc--;
}else
{
if(abs(sum-target)<mmin)
{
ans=sum;
mmin=abs(sum-target);
}
pb++;
}
}
}
return ans;
}
};