16.最接近的三数之和

简介: 16.最接近的三数之和

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

返回这三个数的和。

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

             

解题思路:题目要求找到与目标值 target 最接近的三元组,这里的「最接近」即为差值的绝对值最小。我们可以考虑直接使用三重循环枚举三元组,找出与目标值最接近的作为答案,时间复杂度为 O(N^3)。本题的N最大为1000,会超过时间限制。

class Solution{
    public int threeSumClosest(int []nums,int target){
        Arrays.sort(nums);
        int n=nums.length;
        int best=10000000;
        //枚举a
        for(int i=0;i<n;++i){
            //保证和上一次枚举的元素不相等
            if(i>0 && nums[i]==nums[i-1]){
                continue;            
            }        
            //使用双指针枚举b和c
            int j=i+1,k=n-1;
            while(j<k){
                int sum=nums[i]+nums[j]+nums[k];
                //如果和为target直接返回答案
                if(sum==target){
                    return target;                
                } 
                //根据差值的绝对值来更新答案
                if(Math.abs(sum-target)<Math.abs(best-target)){
                    best=sum;                
                }           
                if(sum>target){
                    // 如果和大于 target,移动 c 对应的指针
                    int k0 = k - 1;
                    // 移动到下一个不相等的元素
                    while (j < k0 && nums[k0] == nums[k]) {
                        --k0;          
                }
                k=k0;
            }else {
                    // 如果和小于 target,移动 b 对应的指针
                    int j0 = j + 1;
                    // 移动到下一个不相等的元素
                    while (j0 < k && nums[j0] == nums[j]) {
                        ++j0;
                    }
                    j = j0;
        }    
    }
}
    return best;
}
}


相关文章
|
6月前
|
算法 测试技术 C#
【贪心】【分类讨论】2499. 让数组不相等的最小总代价
【贪心】【分类讨论】2499. 让数组不相等的最小总代价
|
6月前
|
算法 程序员
【算法训练-二分查找 三】【特殊二分】寻找峰值
【算法训练-二分查找 三】【特殊二分】寻找峰值
57 0
|
3月前
|
算法
LeetCode第16题最接近的三数之和
该文章介绍了 LeetCode 第 16 题最接近的三数之和的解法,与第 15 题类似,通过双指针法减少循环次数,根据差值的绝对值来更新最接近的和,并总结了双指针可减少循环次数的要点。
|
5月前
16. 最接近的三数之和
16. 最接近的三数之和
|
6月前
|
算法 测试技术 C#
【折半处理 二分查找】1755. 最接近目标值的子序列和
【折半处理 二分查找】1755. 最接近目标值的子序列和
【折半处理 二分查找】1755. 最接近目标值的子序列和
|
6月前
|
算法 C++ 索引
寻找最接近子数组和的算法设计及其C++实现
寻找最接近子数组和的算法设计及其C++实现
41 4
|
6月前
|
搜索推荐
【hoare优化版】快速排序算法 | 三数取中&小区间优化(2)
【hoare优化版】快速排序算法 | 三数取中&小区间优化(2)
77 0
|
6月前
leetcode-16:最接近的三数之和
leetcode-16:最接近的三数之和
50 0
|
Java
简单计算时间复杂度
简单计算时间复杂度
35 1
|
11月前
|
机器学习/深度学习 算法 测试技术
C++二分算法: 找出第 K 小的数对距离
C++二分算法: 找出第 K 小的数对距离