zoukankan      html  css  js  c++  java
  • [LeetCode][Java] 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).

    题意:

    给定一个包括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>


  • 相关阅读:
    离奇的软件开发之路
    集群环境中的单例设计模式
    Android 如何更换屏幕上锁界面背景图片
    基于华为Java编程规范的Eclipse checkStyle.xml
    对数据库事务的总结
    [Sciter系列] MFC下的Sciter–1.创建工程框架
    Android 如何添加一种锁屏方式
    Hibernate级联操作 注解
    linux就是这个范儿之融于心而表于行(1)
    Android 如何修改默认的searchable items。
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5147847.html
Copyright © 2011-2022 走看看