[LeetCode][Java] 3Sum Closest

来源:互联网 发布:新手效果图制作软件 编辑:程序博客网 时间:2024/05/24 15:39

题目:

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

题意:

给定一个包含n个整数的数组S,在数组中找出三个整数,使得这三个整数的和与目标值最为接近。返回这三个整数的和。你可以假定对于每个整数,都有确定的一个解。

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

算法分析:


  参考博客:http://www.zhuangjingyang.com/leetcode-3sum/

    和3Sum异曲同工。 不过这里我们要判断的条件不在是三个数字和为0而是和为一个更加接近target的数字。

    我们依然采用3Sum的算法,若有三个数字x1 + x2 + x3 = result 我们所求的便是让result最接近target。因此对于num,首先排序,然后遍历每个数字其下标大于自身的两个数字。然后设置两个全局变量 一个 minVal 用于记录其与target的距离,当距离减小时便更新result的新值。


AC代码:

<span style="font-size:12px;">public class Solution {private  int minVal = Integer.MAX_VALUE;private  int result = 0;    public  int threeSumClosest(int[] num, int target)     {    Arrays.sort(num);    //if number is less than 3 or num is null it's can't be calc    if(num.length <3 ||  num ==null)    return target;    for(int i=0;i<num.length;i++)    {    if(i>0 && num[i] == num[i-1])    continue;    find(i,num,num[i],target);    }    return result;    }    public  void find(int index,int[] num,int target,int res)    {    int l = index+1; //low is equal to index+1 just because we just search element that is bigger than itself    int r = num.length - 1;    while(l<r)    {    if( Math.abs(num[l] + num[r] + target - res) <= minVal)    {    minVal = Math.abs(num[l] + num[r] + target - res);//it's more closer    result = num[l] + num[r] + target;    }    if(num[l] + num[r] + target >res)    r--;    else    l++;    }    }}</span>


0 0
原创粉丝点击