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;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值