La suma más cercana de tres números de Leetcode c ++

La suma más cercana de tres números

Dada una matriz de n números enteros y un valor objetivo objetivo. Encuentre los tres enteros en números para que su suma sea la más cercana al objetivo. Devuelve la suma de estos tres números. Suponga que solo hay una respuesta para cada conjunto de entradas.

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

Solución 1: violencia

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        if(nums.size()<3) return {};
        int closest=target+10000000;
        for(int i=0;i<nums.size()-2;i++)
        {
            int fix=nums[i];
            if(fix>target&&abs(fix+nums[i+1]+nums[i+2]-target)>abs(closest-target)) break;
            //这句话能够省略很多无用功
            for(int j=i+1;j<nums.size()-1;j++)
            {
                for(int k=j+1;k<nums.size();k++)
                {
                    int temp=abs(target-fix-nums[j]-nums[k]);
                    if(temp<abs(closest-target))
                        closest=fix+nums[j]+nums[k];
                }
            }
        }
        return closest;
    }
};

Solución 2: método de doble puntero (puntero de colisión)

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        if(nums.size()<3)
            return {};
        int closest=target+1000000;
        int cha=0;
        for(int i=0;i<nums.size();i++)
        {
            int fix=nums[i];
            int l=i+1;
            int r=nums.size()-1;
            if(l>=r) break;
            while(l<r)
            {
                if(nums[l]+nums[r]+fix==target) return target;
                if(nums[l]+nums[r]<target-fix)
                {
                    cha=target-fix-nums[r]-nums[l];
                    if(cha<abs(closest-target))
                        closest=nums[l]+nums[r]+fix;
                    l++;
                }
                else if(nums[l]+nums[r]>target-fix)
                {
                    cha=nums[l]+nums[r]+fix-target;
                    if(cha<abs(closest-target))
                        closest=nums[l]+nums[r]+fix;
                    r--;
                }
            }
        }
        return closest;
    }
};

Supongo que te gusta

Origin blog.csdn.net/weixin_39139505/article/details/90264179
Recomendado
Clasificación