題目描述:
這道題和前面一道題 三數之和: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;
}
};