LeetCode16——最接近的三数之和(双指针)

题目描述

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

示例:

输入: nums = [-1,2,1,-4], target = 1
输出: 2
解释: 与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

提示:

3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4

题目分析

这个题目与前一个题目很像 LeetCode15——三数之和(排序+双指针)
只不过这个题目返回的是最接近的一个数,因此多了两个变量,一个是返回的结果,另一个是结果与目标的差值,在遍历数组之后找到差值最小的结果进行返回。

代码

Java代码如下:

class Solution {
    public int  threeSumClosest(int[] nums,int target) 
    {
        Arrays.sort(nums);
       int result =0;
       int diff = Integer.MAX_VALUE;
        for(int k=0; k < nums.length-2; k++)
        {
            if(k>0&&nums[k]==nums[k-1])
            {
                continue;
            }
            int curTarget=target -nums[k];
            int i=k+1;
            int j=nums.length-1;
            while(i<j)
            {
                int sum = nums[i]+nums[j];
                if(sum==curTarget)
                {
                   return target;
                } else 
                {
                    int difTarget=Math.abs(curTarget-sum);
                    if(difTarget<diff)
                    {
                        result=sum+nums[k];
                        diff=difTarget;
                    }
                if(sum>curTarget)
                {
                    j--;
                }
                else
                {
                    i++;
                }
                }
            }
        }
        return result;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值