LeetCode-16. 最接近的三数之和

题目来源

最接近的三数之和

题目详情

给你一个长度为 n 的整数数组 nums和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

示例 1:

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

示例 2:

输入: nums = [0,0,0], target = 1
输出: 0

提示:

  • 3 <= nums.length <= 1000
  • -1000 <= nums[i] <= 1000
  • -104 <= target <= 104

相似题目

  1. 15. 三数之和
  2. 18. 四数之和
  3. 最接近的三数之和
  4. 两数之和

题解分析

解法一:双指针法

  1. 与LeetCode-15.三数之和这题十分相似,本题是需要求解三数之和,并求出满足条件的三个数。
  2. 我们可以通过设置三个指针a,b,c分别指向数组中的三个数,并且通过移动这三个指针来寻找满足条件的可能组合。其实,三数之和问题的一个最简单题目是两数之和。两数之和其实很简单,通过首先对数组进行排序,然后设置两个指针,分别指向数组头尾,并且根据两数和与target的大小来移动指针就可以找到所有满足条件的组合。
  3. 在本题中,与两数之和问题不同的是,我们这里有三个指针,为了不遗漏的找到所有满足条件的组合,我们可以先固定a指针,然后使用类似于两数之和中使用的方法,分别从头尾指针开始往数组中间靠拢来寻找满足条件的三数组合。
  4. 此外,与三数之和题目不同的一点是,我们这里并不是找target,而是寻找距target最近的三数组合方案,所以,我们需要对之前的方案进行小的改进,也就是需要使用Math的abs函数寻找绝对值最小的可能组合。
class Solution {
    public int threeSumClosest(int[] nums, int target) {
        int minans = Integer.MAX_VALUE;
        int ans = 0;
        int len = nums.length;
        Arrays.sort(nums);// 对数组进行排序
        for(int a = 0; a<len; a++){
            int c = len - 1;
            int leave = target - nums[a];
            for(int b = a + 1; b<len; b++){
                while(b < c && nums[b] + nums[c] > leave){
                    if(Math.abs(target - nums[a] - nums[b] - nums[c]) < minans){
                        minans = Math.abs(target - nums[a] - nums[b] - nums[c]);
                        ans = nums[a] + nums[b] + nums[c];
                    }
                    c--;
                }

                if(b == c){
                    break;
                }

                if(Math.abs(target - nums[a] - nums[b] - nums[c]) < minans){
                    minans = Math.abs(target - nums[a] - nums[b] - nums[c]);
                    ans = nums[a] + nums[b] + nums[c];
                }
            }
        }
        return ans;
    }
}
posted @ 2022-04-05 20:11  Garrett_Wale  阅读(86)  评论(0编辑  收藏  举报