LeetCode 016 最接近的三数之和

016 最接近的三数之和 腾讯精选50
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
方法一:暴力求解
代码:

public static int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums);
        int length=nums.length;
        int d=nums[0]+nums[1]+nums[2];
        int sum=0,num=Math.abs(target-nums[0]-nums[1]-nums[2]);//三数之和,三数之和跟target的差值绝对值
        if(length==3){
            return sum;
        }
        for (int i = 0; i <length-2; i++) {
            for (int j = i+1; j <length-1 ; j++) {
                for (int k = j+1; k <length ; k++) {
                    sum=nums[i]+nums[j]+nums[k];
                    if (num>Math.abs(target-sum)){
                        num=Math.abs(target-sum);
                        d=sum;
                    }
                }
            }
        }
        return d;
    }

注意:先排序,再Math.abs()函数比较

方法二:双指针法
思路:
跟上个题一样,三个数之和类似问题最简单的方法就是用双指针法,时间复杂度为O(n^2)。先进行排序,左指针放在i+1位置,右指针放在length-1位置,根据三数之和和理想值的大小移动指针
代码:
public static int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int length=nums.length;
int closesum=nums[0]+nums[1]+nums[2];//最近的值
if(length==3){
return closesum;
}
for (int i = 0; i <length-2; i++) {
int j=i+1,k=length-1;//定义左右双指针
while(j<k){
int sum=nums[i]+nums[j]+nums[k];
if(Math.abs(target-sum)<Math.abs(target-closesum)){
closesum=sum;
}
if(sum<target){//小就左移
j++;
}else if(sum>target){//大就右移
k–;
}else return target;
}
}
return closesum;
}
注意:双指针法的前提条件是有序数组,如果数组无序,要调用Arrays里的sort排序函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值