Given an arrayS 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.
当看到这道题的时候,虽然已经做过3Sum那道题,可是一开始脑子里面还是没有想到好的方法,想出来的只有暴力遍历,还是自己的算法思维不够,结果提交代码的时候,我就呵呵了——timelimited。附上这段代码,我已泪崩......
<span style="font-size:14px;">public int threeSumClosest(int[] nums, int target)
{
if (nums.length == 0 || nums == null)
return -1;
int closestNum = 0;
int tmp1 = Integer.MAX_VALUE;
for (int i = 0; i < nums.length - 2; i++)
{
for (int j = i + 1; j < nums.length - 1; j++)
{
for (int k = nums.length - 1; k > j; k--)
{
int tmp = Math.abs(nums[i] + nums[j] + nums[k] - target);
if (tmp < tmp1)
{
tmp1 = tmp;
closestNum = nums[i] + nums[j] + nums[k];
}
}
}
}
return closestNum;
}
</span>
后来重新去复习了一下前面做过的3Sum
http://blog.csdn.net/u013272948/article/details/52709122
,然后想出来了如下的算法。
package com.alibaba.learning;
import java.util.Arrays;
public class Solution
{
public int threeSumClosest(int[] nums, int target)
{
if (nums == null || nums.length < 3)
return -1;
int closestSum = 0;
int closestDis = Integer.MAX_VALUE;
Arrays.sort(nums);
for (int i = 0; i < nums.length - 2; i++)
{
int j = i + 1;
int k = nums.length - 1;
while (j < k)
{
int sum = nums[i] + nums[j] + nums[k];
if (target < sum)
{
if (sum - target < closestDis)
{
closestDis = sum - target;
closestSum = sum;
}
k--;
}
else if (target > sum)
{
if (target - sum < closestDis)
{
closestDis = target - sum;
closestSum = sum;
}
j++;
}
else
{
return sum;
}
}
}
return closestSum;
}
public static void main(String[] args)
{
Solution s = new Solution();
int[] nums = { 1, 2, 4, 8, 16, 32, 64, 128 };
int target = 82;
System.out.println(s.threeSumClosest(nums, target));
}
}