3Sum Closest(java实现)

        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));
	}
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值