首页 > 代码库 > LeetCode:3Sum Closest

LeetCode: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).
 
这道题和3Sum问题类似。首先肯定要排序,设置一个min记录与target的最接近的sum值。

public class Solution {
     public int threeSumClosest(int[] num, int target)
    {
        if(num.length<3)return target;
        quickSort(num,0,num.length-1);
        int min = num[0]+num[1]+num[2];
        for(int i=0;i<num.length - 2;i++)
        {
            int start = i + 1;
            int end = num.length - 1;
            while(start<end)
            {
                if(num[i] + num[start] + num[end] == target)
                {
                    min = target;
                    return min;
                }
                else if(num[i] + num[start] + num[end] >target)
                {
                    if(Math.abs(num[i] + num[start] + num[end] - target)<Math.abs(min-target))
                    {
                        min = num[i] + num[start] + num[end];
                    }
                    end --;
                }
                else if(num[i] + num[start] + num[end] <target)
                {
                    if(Math.abs(num[i] + num[start] + num[end] - target)<Math.abs(min-target))
                    {
                        min = num[i] + num[start] + num[end];
                    }
                    start ++;
                }
            }
        }
        return min;
    }
    public void quickSort(int[] num,int begin,int finish)
    {
        if(begin<finish)
        {
            int p = partition(num,begin,finish);
            quickSort(num,begin,p-1);
            quickSort(num,p+1,finish);
        }
       
    }
    public int partition(int[] num,int begin,int finish)
    {
        int value = http://www.mamicode.com/num[begin];
        if(finish - begin == 0)return begin;
        while(begin<finish)
        {
            while(begin<finish&&num[finish]>value)
            {
                finish --;
            }
            num[begin] = num[finish];
            while(begin<finish&&num[begin]<=value)
            {
                begin++;
            }
            num[finish] = num[begin];
        }
        num[begin] = value;
        return begin;
    }
}