题目描述
给定target,找到数组中三个数之和最接近target的
一刷 双指针 77/98通过
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
if(nums.size()<3) return 0;
sort(nums.begin(),nums.end());
int maxn = nums[0]+nums[1]+nums[2];
int left,right;
for(int i=0;i<nums.size()-2;i++){
if(nums[i]>target) return maxn;
//if(i>0&&nums[i]==nums[i+1]) continue;
left = i+1;
right = nums.size()-1;
while(left<right){
int temp = nums[i]+nums[left]+nums[right];
if(temp==target) return target;
else{
if(target>temp){
if(abs(target-temp)<abs(target-maxn)){
maxn = temp;
}
right--;
}
else{
if(abs(target-temp)<abs(target-maxn)){
maxn = temp;
}
left++;
}
}
}
}
return maxn;
}
};
一刷纠错
- 左右弄反
- 多余判断nums[i]只要比target大就跳过,因为数组里存在负数,加上比自己大的负数会继续减小temp,使temp和target的距离越来越近
二刷 ac
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
if(nums.size()<3) return 0;
sort(nums.begin(),nums.end());
int maxn = nums[0]+nums[1]+nums[2];
int left,right;
for(int i=0;i<nums.size()-2;i++){
//if(nums[i]>target) return maxn;
//if(i>0&&nums[i]==nums[i+1]) continue;
left = i+1;
right = nums.size()-1;
while(left<right){
int temp = nums[i]+nums[left]+nums[right];
if(temp==target) return target;
else if(target>temp){
if(abs(target-temp)<abs(target-maxn)){
maxn = temp;
}
left++;
}
else{
if(abs(target-temp)<abs(target-maxn)){
maxn = temp;
}
right--;
}
}
}
return maxn;
}
};