题目: 传送门
分析: 题意要求找到三个数的和和target最接近,力扣15是找到三个数使得他们的和是0,两个题非常相似,只是一个和是确定的,一个是未知的,但是解决思路一样,就是三个数先确定a,然后找b、c,找b和c可以通过移动双指针,如果数组是有序的,那么确定两个指针,分别放到数组两端,他们的和就有了规律,如果两个指针的和比想要的大,我们可以移动右指针,如果小,我们可以移动左指针,这样,我们就可以找到我们需要的结果。
代码:
#include<iostream>
#include<vector>
#include<math.h>
#include<algorithm>
using namespace std;
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int ans=999999999;
int n = nums.size();
for (int i = 0; i < n - 2; i++) {
int sum1, sum2;
int j = i + 1, k = n - 1;
sum1= nums[i] + nums[j] + nums[k];
sum2 = sum1;
if (abs(ans - target) > abs(sum1 - target)) {
ans = sum1;
}
if (sum1 < target) {
j++;
}
else if (sum1 == target) {
return target;
}
else {
k--;
}
while (j < k) {
sum2 = nums[i] + nums[j] + nums[k];
if (sum2 == target)
return target;
else if (sum2 < target) {
j++;
if (abs(sum2 - target) <abs(sum1 - target)) {
sum1 = sum2;
}
}
else {
k--;
if (abs(sum2 - target) < abs(sum1 - target)) {
sum1 = sum2;
}
}
}
if (abs(ans - target) > abs(sum1 - target)) {
ans = sum1;
}
if (abs(ans - target) > abs(sum2 - target)) {
ans = sum2;
}
}
return ans;
}
};
int main() {
vector<int>nums;
while (1) {
int num;
cin >> num;
nums.push_back(num);
if (cin.get() == '\n') {
break;
}
}
int t;
cin >> t;
Solution s;
cout<<s.threeSumClosest(nums, t)<<endl;
}