每日一题 最接近的三数之和

每日一题

Leetcode 第16题 最接近的三数之和

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest

第一种方法是暴力遍历,即找出所有的可能,达到与target相差的绝对值最小的组合。

    int threeSumClosest(vector<int>& nums, int target) {
        if(nums.size()<3)
            return 0;
        int i,j,k,sum,min,sub;
        min=nums[0]+nums[1]+nums[2];
        sub=abs(min-target);
        for(i=0;i<nums.size()-2;i++)
            for(j=i+1;j<nums.size()-1;j++)
                for(k=j+1;k<nums.size();k++)
                {
                    sum=nums[i]+nums[j]+nums[k];
                    int temp=abs(sum-target);
                    if(temp<sub)
                    {
                        sub=temp;
                        min=sum;
                    }                       
                }
        return min;
    }

时间复杂度488ms,空间复杂度8.7MB。

第二种方法指针法,和之前的三数之和相似,同样是指针对撞的情况。

    int threeSumClosest(vector<int>& nums, int target) {
        if(nums.size()<3)
            return 0;
        sort(nums.begin(),nums.end());
        int j,k,sum,temp;
        int result=nums[0]+nums[1]+nums[2];
        int min=abs(nums[0]+nums[1]+nums[2]-target);
        for(int i=0;i<nums.size()-2;i++)
        {
            int j=i+1;
            int k=nums.size()-1;
            while(j<k)
            {
                sum=nums[i]+nums[j]+nums[k];
                temp=abs(sum-target);
                if(temp<min)
                {
                    min=temp;
                    result=sum;
                }
                if(sum==target)
                    return sum;
                else if(sum>target)
                        k--;
                    else if(sum<target)
                        j++;
            }
        }
        return result;
    }

时间复杂度12ms,空间复杂度8.5MB。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页