这一题,拿到手之后,我一开始有点懵逼,但是昨天刚做了3SUM,想必一定有关系,于是,调试了一下,超过了99%,哈哈
这一题,其实和昨天是相似得,每一次都遍历一个节点,剩下得就从下一个和最后一个开始缩小范围去搜索,如果此时和大于target,说明此时右边太大了,(当然得先排序),就hi--;同理,和过小,就lo++;此时比较接近程度,并更新;
当第一个元素就超过了target,那后面就没必要再算下去了;
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int close_degree = 999;
int value = 0;
int lo = 0;
int hi = 0;
int sum = 0;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size() - 2; ++i)
{
if (i>0&&nums[i] >= target) break;
lo = i + 1;
hi = nums.size() - 1;
if (i==0||(i > 0 && nums[i] != nums[i - 1]))
{
sum = nums[i] + nums[lo] + nums[hi];
if (abs(sum - target) < close_degree)
{
value = sum;
close_degree = abs(sum - target);
}
while (true)
{
if (sum < target) ++lo;
else hi--;
if (lo >= hi) break;
sum = nums[i] + nums[lo] + nums[hi];
if (abs(sum - target) < close_degree)
{
value = sum;
close_degree = abs(sum - target);
}
}
}
}
return value;
}
};