【双指针】最接近的三数之和

16. 最接近的三数之和

给你一个长度为n的整数数组nums 和 一个目标值target。请你从nums 中选出三个整数,使它们的和与target最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。


示例 1:

输入:nums = [-1,2,1,-4], target = 1输出:2解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

示例 2:

输入:nums = [0,0,0], target = 1输出:0


提示:

3 <= nums.length <= 1000

-1000 <= nums[i] <= 1000

-104<= target <= 104


关于如何遍历不重复


双指针部分思路:

数组排序以后,当当前三个数字加起来大于target时,右边的指针右移一位。

当当前三个数字加起来小于target时,左边的指针左移一位。

当左指针左移时,三个数字之和一定增大,如果当前数字大于target会导致“距离”越来越远,

同理右指针右移。


    int threeSumClosest(vector& nums, int target) {

        sort(nums.begin(),nums.end());

        int res;

        bool first=true;

        int p1=0,ncount=nums.size();

        while (p1

            if (p1==0 || nums[p1]!=nums[p1-1]){

                int p2=p1+1,p3=ncount-1;

                while (p2!=p3){

                    int temp=nums[p1]+nums[p2]+nums[p3];

                    if (first || abs(target-temp)

                        first=false;

                        res=temp;

                    }

                    //双指针变换

                    if (temp>target) --p3;

                    else if(temp

                    else return temp;

                }

            }

            ++p1;

        }

        return res;

    }

你可能感兴趣的:(【双指针】最接近的三数之和)