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;
}
}


目录
打赏
0
0
0
0
9
分享
相关文章
|
9月前
16. 最接近的三数之和
16. 最接近的三数之和
LeetCode 16.最接近的三数之和
LeetCode 16.最接近的三数之和
85 0
LeetCode - #16 最接近的三数之和
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
每日算法系列【LeetCode 16】最接近的三数之和
每日算法系列【LeetCode 16】最接近的三数之和
|
10月前
leetcode-16:最接近的三数之和
leetcode-16:最接近的三数之和
74 0
LeetCode第16题最接近的三数之和
该文章介绍了 LeetCode 第 16 题最接近的三数之和的解法,与第 15 题类似,通过双指针法减少循环次数,根据差值的绝对值来更新最接近的和,并总结了双指针可减少循环次数的要点。
leetcode:16.最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
74 0
【LeetCode16】最接近的三数之和(双指针)
和leetcode15三数之和类似,三层循环时间复杂度O ( n 3 ) O(n^3)O(n 3 )过高,使用双指针虽说不能马上降到O ( n ) O(n)O(n),但就是这类题的常用套路: 遍历一遍数组元素,当前元素为num[i];
123 0
【LeetCode16】最接近的三数之和(双指针)
LeetCode: 16. 最接近的三数之和 | 双指针专题
【LeetCode: 16. 最接近的三数之和 | 双指针专题 】
69 1