问题描述:Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
这里给出O(n²)的算法,并且整体的思路和上一题的求3Sum并没有太大差别。
1.给定数组vector
和目标值int target
,为了使复杂度为O(n²),首先使用STL的sort函数对数组进行排序:
int len = nums.size();
sort(nums.begin(), nums.end());
int result,temp = INT32_MAX;
2.然后同样基于“2Sum”的思路,我们首先选定n,从数组的nums[0]
遍历至nums[nums.size() - 3]
,然后使用求2Sum的算法,取n = target - nums[i]
为目标值,找出first和second,使得nums[first] + nums[second] - n
最接近0。使用temp记录nums[first] + nums[second] - n
的大小,result记录最接近的结果,:
int n = target - nums[i];
//find 2Sum for n
int first = i + 1, second = len - 1;
(1)当abs(nums[first] + nums[second] - n) < temp
,更新temp和result;
(2)当nums[first] + nums[second] > n
,second–;
(3)当nums[first] + nums[second] < n
,first++;
(4)当nums[first] + nums[second] = n
,因为这个时候可以得到target,可以直接返回target。
while (first < second)
{
if (abs(nums[first] + nums[second] - n) < temp)
{
result = nums[i] + nums[first] + nums[second];
temp = abs(nums[first] + nums[second] - n);
}
if (nums[first] + nums[second] > n )
--second;
else if (nums[first] + nums[second] < n )
++first;
else return target;
}
#include
#include
#include
using namespace std;
int threeSumClosest(vector<int>& nums, int target)
{
int len = nums.size();
sort(nums.begin(), nums.end());
int result,temp = INT32_MAX;
for (int i = 0; i < len - 2; ++i)
{
int n = target - nums[i];
//find 2Sum for n
int first = i + 1, second = len - 1;
while (first < second)
{
if (abs(nums[first] + nums[second] - n) < temp)
{
result = nums[i] + nums[first] + nums[second];
temp = abs(nums[first] + nums[second] - n);
}
if (nums[first] + nums[second] > n )
--second;
else if (nums[first] + nums[second] < n )
++first;
else return target;
}
}
return result;
}
int main()
{
int a[] = { 1,2,-2,-1 };
vector<int> nums(a, a + 4);
int res;
res = threeSumClosest(nums,3);
cout << res << endl;
return 0;
}