3Sum Closest

题目:Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

    For example, given array S = {-1 2 1 -4}, and target = 1.

    The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

思路:

与之前的求解方法一样,只不过本题变成求和最接近的和,用绝对值即可。

程序里面的一个技巧就是,遇到重复数字直接跳过,这是因为,第一次的时候,就已经考虑后面的了,比如说1,1,1,2

第一个选择1的时候,后面就已经有left等于后面的1,所以同样的道理,最后也是要从后往前找不同的第一个点,至于找到了,相同的pass。

程序的另外一个技巧就是,遇到等于目标数字的,直接赋值,而有不同的,再去进行比较,这里指绝对值。至于后面大于小于的情况,作同样处理。

代码:

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        int length=nums.size();
        sort(nums.begin(),nums.end());
        int left=0,right=length-1;
        int res=INT_MAX,result=target;
        for(int i=0;i<length-2;i++){
            if(i>0 && nums[i]==nums[i-1]){
                continue;
            }

            int a=nums[i];
            int left=i+1,right=length-1;
            while(left<right){
                int b=nums[left],c=nums[right];
                int sum=a+b+c;

                if(sum==target){
                    return target;
                }else{
                    if(abs(target-sum)<=res){
                        res=abs(target-sum);
                        result=sum;
                    }

                    if(sum>target){
                        right--;
                        while(nums[right]==nums[right+1]){
                            right--;
                        }

                    }

                    if(sum<target){
                        left++;
                        while(nums[left]==nums[left-1]){
                            left++;
                        }
                    }
                }

            }
        }
        return result;
    }
};


原文地址:https://www.cnblogs.com/jsrgfjz/p/8519873.html