# 16 - 3Sum Closest
解法一 - Two Pointer
這題跟 # 15 非常像,主要只差在需要用額外的變數來記錄目前答案跟 target 的差是多少,不斷尋找差值更小的。實作如下:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
// Note:
// 1. Iterate to n-2 only
// 2. Need to skip same element to avoid duplicate triplets
int n = nums.size();
int closestSum, minDiff=INT_MAX;
for(int i=0; i<n-2; i++) {
// skip same element to avoid duplicate triplets
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
searchPair(nums, target, i+1, nums[i], closestSum, minDiff);
}
return closestSum;
}
private:
void searchPair(vector<int>& nums, int target, int start, int first, int& closestSum, int& minDiff) {
int l=start, r=nums.size()-1;
while(l<r) {
int sum = first+nums[l]+nums[r];
if(abs(sum-target) < minDiff) {
closestSum = sum;
minDiff = abs(sum-target);
}
if(sum == target) {minDiff = 0; closestSum = target; return;}
else if(sum > target) r--;
else if(sum < target) l++;
}
}
};
如果不包成 function,可讀性好像也不錯:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int res, minDiff = INT_MAX;
sort(nums.begin(), nums.end());
for(int i=0; i<nums.size(); i++) {
int front = i+1;
int back = nums.size()-1;
while(front < back) {
int sum = nums[i] + nums[front] + nums[back];
int diff = abs(target - sum);
if(diff < minDiff) {
minDiff = diff;
res = sum;
}
if(sum < target) {
front++;
}
else if(sum > target) {
back--;
}
else {
return target;
}
}
while(i+1<nums.size() && nums[i+1] == nums[i])
i++;
}
return res;
}
};
Last updated