这题比较简单,我就用最基本的方法做的。可能有更好的办法,比如说不需要两重循环?
#include <iostream>
#include <algorithm>
#include <climits>
#include <vector>
using namespace std;
struct Record {
Record(int a, int b, int c) :x(a), y{b}, z(c) {}
int x;
int y;
int z;
};
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
Record record(0,0,0);
int min_gap=INT_MAX;
for (int i=0; i<nums.size()-2; ++i) {
int diff = target - nums[i];
int p1=i+1, p2=nums.size()-1;
while(p1<p2) {
cout<<"i="<<i<<" p1="<<p1<<" p2="<<p2<<endl;
int sum = nums[p1]+nums[p2];
if (abs(diff-sum) < min_gap) {
min_gap = abs(diff-sum);
record=Record(nums[i], nums[p1], nums[p2]);
}
if (sum<diff) p1++;
else if (sum>diff) p2--;
else return target;
}
}
return record.x+record.y+record.z;
}
int main()
{
vector<int> S={-1,2,1,-4};
cout<<threeSumClosest(S, 1)<<endl;
return 0;
}
本文介绍了一个解决三数之和最接近目标值问题的算法实现。通过先对输入数组进行排序,然后使用双指针技巧遍历数组来寻找最接近目标值的三个数。该方法避免了不必要的重复计算,提高了算法效率。
297

被折叠的 条评论
为什么被折叠?



