题目
代码(首刷看解析)
这里需要注意的是:判断最接近时,使用的绝对值,但是在满足条件赋值时不是用的绝对值。
先找二数之和的最接近,在拿到这个最接近的数字后,和当前数字相加,再进行最接近的三数之和的判断。
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int sz = nums.size();
int dif = INT_MAX;
for(int i = 0; i < sz-2; i++) {
int sum = twoSum(nums, target - nums[i], i+1) + nums[i];
if(abs(dif) > abs(target-sum))
dif = target-sum;
}
return target-dif;
}
int twoSum(vector<int>& nums, int target, int start) {
int dif = INT_MAX;
int low = start, high = nums.size()-1;
while(low < high) {
int sum = nums[low] + nums[high];
if(abs(dif) > abs(target - sum))
dif = target - sum;
if(target > sum) {
low++;
} else {
high--;
}
}
return target-dif;
}
};
代码(10.2 二刷看解析)
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int dif = INT_MAX;
sort(nums.begin(), nums.end());
for(int i = 0; i < nums.size()-2; i++) {
int sum = twoSum(nums, target-nums[i], i+1) + nums[i];
if(abs(dif) > abs(sum-target))
dif = target-sum;
}
return target-dif;
}
int twoSum(vector<int>& nums, int target, int k) {
int dif = INT_MAX;
int l = k, r = nums.size()-1;
while(l < r) {
int sum = nums[l] + nums[r];
if(abs(sum-target) < abs(dif))
dif = target-sum;
if(sum < target) {
l++;
} else {
r--;
}
}
return target-dif;
}
};