leetcode 最接近的三数之和 / 3Sum closest
程序员文章站
2022-05-12 09:25:25
...
题目描述:
这道题和前面一道题 三数之和:https://blog.csdn.net/twt727/article/details/80003382 类似,思路也差不多,都是头和尾设置两个指针从两头往中间扫,不同之处在于需要设置一个变量 minRes 来保存最接近的三数之和,边扫描边对 minRes 进行更新,代码如下:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int temp;
int i,start,end,minRes;
sort(nums.begin(),nums.end());
minRes = nums[0] + nums[1] + nums[nums.size() - 1];//对minRes初始化
for(i = 0 ;i < nums.size() - 2;i++){
temp = target - nums[i];
start = i + 1;
end = nums.size() - 1;
while(start < end){
if(nums[start] + nums[end] < temp){
if(minRes > target && minRes - target > target - nums[start] - nums[end] - nums[i]){//对前一个minRes比target大还是小要分开讨论
minRes = nums[start] + nums[end] + nums[i];
}
if(minRes < target && minRes < nums[start] + nums[end] + nums[i]){
minRes = nums[start] + nums[end] + nums[i];
}
start ++;
continue;
}
if(nums[start] + nums[end] > temp){
if(minRes > target && minRes > nums[start] + nums[end] + nums[i]){
minRes = nums[start] + nums[end] + nums[i];
}
if(minRes < target && target - minRes > nums[start] + nums[end] + nums[i] - target){
minRes = nums[start] + nums[end] + nums[i];
}
end --;
continue;
}
else{
return target;//相等的话直接返回答案
}
}
}
return minRes;
}
};
看了别人的代码,其实这道题用abs来判断的话还可以精简许多,自己还是写得太渣了,代码如下:
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int min_dis=INT_MAX;
int result=0;
if(nums.size()<3)return result;
sort(nums.begin(),nums.end());
for(int k=0;k<nums.size();k++){
int i=k+1,j=nums.size()-1;
while(i<j){
int sum=nums[i]+nums[j]+nums[k];
int temp_dis=abs(target-sum);
if(temp_dis==0)return sum;
else if(sum<target){
if(min_dis>temp_dis)min_dis=temp_dis,result=sum;
i++;
}
else{
if(min_dis>temp_dis)min_dis=temp_dis,result=sum;
j--;
}
}
}
cout<<min_dis<<endl;
return result;
}
};