思路:首先整体思路还是之前的三数和游标的思想
当 i+j+k > 0 时候说明k取的数字大了,k--
当 i+j+k <0 时候说明j取的数字小了, j++
只不过在每次计算过程加上count值和给定的target比较,每次比较res只保留最小的count的计算结果。
最终将res返回
# include<iostream>
# include<vector>
# include<string>
# include<algorithm>
# include<math.h>
# include<climits>
using namespace std;
int threeSumClosest(vector<int>& nums, int target) {
int i, j, k;
int count = 0;
int res=0,Min=INT_MAX;//res临时保存结果,Min保存最终结果
i = 0; j = i + 1; k = nums.size() - 1;
sort(nums.begin(), nums.end());//将vector有序化
while (i < nums.size() - 2) {
while (j < k) {
if ((count = (nums[i] + nums[j] + nums[k])) > target) {
if (abs(count - target) < Min) {
Min = min(abs(count - target), Min);//比较最小值
res = count;
}
k--;
while (k > j && nums[k + 1] == nums[k])k--;
}
else if ((count = (nums[i] + nums[j] + nums[k])) < target) {
if (abs(count - target) < Min) {
Min = min(abs(count - target), Min);//比较最小值
res = count;
}
j++;
while (k > j && nums[j] == nums[j - 1])j++;
}
else {
return target;
}
}
i++;
while (i < nums.size() - 2 && nums[i] == nums[i - 1])i++;
j = i + 1; k = nums.size() - 1;
}
return res;
}
int main(void) {
vector<int> nums;
nums.push_back(1);
nums.push_back(1);
nums.push_back(1);
nums.push_back(0);
cout << threeSumClosest(nums, -100);
return 0;
}