给一个包含 n 个整数的数组 S, 找到和与给定整数 target 最接近的三元组,返回这三个数的和。
注意事项
只需要返回三元组之和,无需返回三元组本身
样例
例如 S = [-1, 2, 1, -4] and target = 1. 和最接近 1 的三元组是 -1 + 2 + 1 = 2.
题目链接:http://www.lintcode.com/zh-cn/problem/3sum-closest/#
首先对数组进行排序,如果第一个数就比目标值的三分之一大,那么久返回前三个数的和,如果最后三个数比目标值的三分之一小,就返回最后三个数的和。如果不是以上两种情况,遍历数组。
这里也是有三个指针,如果第一个指针(i)指向的数比目标值的三分之一小,直接跳过(第一个指针指向的是三个数中最大的),如果和下一个数一样,也跳过。然后就是把三个数的和和target进行比较,分为两种情况,遇到重复的数同样是跳过。
class Solution {
public:
/**
* @param numbers: Give an array numbers of n integer
* @param target: An integer
* @return: return the sum of the three integers, the sum closest target.
*/
int threeSumClosest(vector<int> nums, int target) {
// write your code here
sort(nums.begin(),nums.end());
if (nums[0] >= target/3) return nums[0] + nums[1] + nums[2];
if (nums[nums.size()-1] <= target/3) return nums[nums.size()-1] + nums[nums.size()-2] + nums[nums.size()-3];
int res;
int d = INT_MAX;
for (int i = 2;i < nums.size();i++) {
if (nums[i] < target/3 || i+1 < nums.size() && nums[i] == nums[i+1]) continue;
for (int j = 0,k = i - 1,sum = nums[j] + nums[k],temp = target - nums[i];j < k;sum = nums[j] + nums[k]) {
if (sum < temp || j > 0 && nums[j] == nums[j-1]) {
if (temp - sum < d) {
d = temp -sum;
res = sum + nums[i];
}
j++;
}
else if (sum > temp || k+1 < i && nums[k] == nums[k+1]) {
if (sum - temp < d) {
d = sum - temp;
res = sum + nums[i];
}
k--;
}
else return target;
}
}
return res;
}
};