欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode 最接近的三数之和 / 3Sum closest

程序员文章站 2022-05-12 09:25:25
...

题目描述:

leetcode 最接近的三数之和 / 3Sum closest

    这道题和前面一道题 三数之和: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;
    }
};