LeetCode-16 最接近的三数之和

  • 题目:16. 最接近的三数之和
  • 难度:中等
  • 分类:数组
  • 解决方案:双指针

今天我们学习第16题最接近的三数之和,这是一道中等题。像这样数组的题目经常作为面试题来考察面试者算法能力和写代码能力,因此最好能手写出该题。下面我们看看这道题的题目描述。

题目描述

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

示例:

给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

分析

这个题和LeetCode-15 三数之和的解题思路差不多,在第15题中是为了寻找满足a + b + c = 0,而在这道题中首先给出了一个目标值target,然后寻找三个数a + b + c的和与target最接近,即|a + b + c-target|的值最小。对示例分析如下图所示:

在这里插入图片描述

将上述分析过程转化为java代码如下所示:

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        
        int sum =0;    // 表示数组中三个元素的和
        int dis = Integer.MAX_VALUE;   // 表示数组中三个元素的和与target的距离,即|sum-target|
        
        // 对数组进行排序
        Arrays.sort(nums);
        // 遍历数组
        for(int i=0; i<nums.length-2; ++i){
            // 定义左指针和右指针
            int left = i+1, right = nums.length-1;
            
            while(left<right){
                // 数组中三个元素的和与target的差,即sum-target 
                int diff = nums[i] + nums[left] + nums[right] - target;
                
                // 当sum-target == 0,则说明已经找到与target最近的数了(即target本身)
                if (diff == 0)
                    return target;
                
                // 寻找最小距离
                if(Math.abs(diff) < dis){
                    dis = Math.abs(diff);
                    sum = diff + target;
                }
                
                // 移动左右指针
                if(diff > 0){
                    --right;
                }else{
                    ++left;
                }
            }
        }
        
        return sum;
    }
}

在这里插入图片描述

Github地址

LeetCode-16 最接近的三数之和

参考链接

16. 最接近的三数之和

在这里插入图片描述

更多文章请添加公众号:算法半岛(扫描上图二维码即可关注)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值