3Sum Closest

Posted 萝卜er

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.

 
Example

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).

不算是一道难题,可是硬生生把我的   Your submissions per problem 从3.2弄到了3.8(别看数据耀眼,因为还没刷几道题。。。)每次不是这组数据错就是另一组数据错

思路:类似2sum,2sum是两个指针两头逼近,这个无非是另外一个节点从头到尾遍历罢了,注意边界条件。

上代码

public class Solution {
    /**
     * @param numbers: Give an array numbers of n integer
     * @param target : An integer
     * @return : return the sum of the three integers, the sum closest target.
     */
    public int threeSumClosest(int[] numbers, int target) {
        Arrays.sort(numbers);
        int ans=Integer.MAX_VALUE;
        int anstemp;
        for(int i=0;i<numbers.length-2;i++){
            anstemp=Integer.MAX_VALUE;//这个每次for循环都要重置一下,因为上一次的anstemp会对当前的决策产生影响
            int j=i+1;//
            int k=numbers.length-1;//
            while(j<k){
                int temp=numbers[i]+numbers[j]+numbers[k];
                anstemp=witchclosezero(temp,anstemp,target);
                if(anstemp>target){
                    k--;//太大,后指针前移
                }else if(anstemp<target){
                    j++;//太小,前指针后移
                }else{
                    return anstemp;//等于直接返回
                }
            }
            ans=witchclosezero(anstemp,ans,target);//把当前层的anstemp保存下来,下一次for循环会重置
        }
        return ans;
    }
    public int witchclosezero(int A,int B,int t){//返回A,B中更接近t的那个
        int tempa=A-t;
        tempa=tempa>0?tempa:-tempa;
        int tempb=B-t;
        tempb=tempb>0?tempb:-tempb;
        return tempb>tempa?A:B;
    }
}

 

以上是关于3Sum Closest的主要内容,如果未能解决你的问题,请参考以下文章

16. 3Sum Closest

16. 3Sum Closest

Leetcode 16. 3Sum Closest

LeetCode(16):3Sum Closest

Leetcode3Sum Closest

3Sum Closest