LeetCode 16. 最接近的三数之和

题目地址

16. 最接近的三数之和

题目分析

这个题和三数之和很相似,所以我采用了相同的做法,先进行排序,每次固定左手边的值。然后使用双指针从左边和右边寻找三数之和最接近target的值,这样做的效率有点差,两个月过去了水平还没啥提升,我醉了。

实现代码

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        //先进行排序,即对数据进行预处理。
        Arrays.sort(nums);
        int index = 0;
        //返回值
        int res = Integer.MAX_VALUE;
        //为什么要小于nums.length - 2呢?主要是为了防止出现刚好三个数的情况。
        while(index < nums.length - 2){
            //注意,这里左指针不需要取和index不重复的值。
            int left = index + 1;
            int right = nums.length - 1;
            //双指针进行判断。
            while(left < right){
                int temp = nums[left] + nums[right] + nums[index];
                //如果res还是默认值或者temp和target之差的绝对值要比res之差的绝对值小,则更新新的值。
                if(res == Integer.MAX_VALUE || (Math.abs(temp - target) < Math.abs(res - target))){
                    res = temp;
                }
                //如果temp比目标值大,我们右指针向左寻找第一个与原来的值不等的数字。
                if(temp >= target){
                    int curVal = nums[right];
                    while(right > left && nums[right] == curVal){
                        right--;
                    }
                }else{
                    //比目标值小的情况下同理。
                    int curVal = nums[left];
                    while ((left < right && nums[left] == curVal)){
                        left++;
                    }
                }
            }
            //这里是将左手边固定值寻找下一个不等的数字。
            int curVal = nums[index];
            while(index < nums.length-2 && nums[index] == curVal){
                index++;
            }
        }
        return res;
    }
}

总结

自己真菜!

更新

在提交完这次答案后,才看到题目中说只存在一个值,那么当我们寻找到与target相等的值,就可以直接返回不需要更多的判断了!!

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        //先进行排序,即对数据进行预处理。
        Arrays.sort(nums);
        int index = 0;
        //返回值
        int res = Integer.MAX_VALUE;
        //为什么要小于nums.length - 2呢?主要是为了防止出现刚好三个数的情况。
        while(index < nums.length - 2){
            //注意,这里左指针不需要取和index不重复的值。
            int left = index + 1;
            int right = nums.length - 1;
            //双指针进行判断。
            while(left < right){
                int temp = nums[left] + nums[right] + nums[index];
                //如果res还是默认值或者temp和target之差的绝对值要比res之差的绝对值小,则更新新的值。
                if(res == Integer.MAX_VALUE || (Math.abs(temp - target) < Math.abs(res - target))){
                    res = temp;
                }
                //加快运行速率!!!!!
                if(temp == target){
                    return temp;
                }
                //如果temp比目标值大,我们右指针向左寻找第一个与原来的值不等的数字。
                else if(temp > target){
                    int curVal = nums[right];
                    while(right > left && nums[right] == curVal){
                        right--;
                    }
                }else{
                    //比目标值小的情况下同理。
                    int curVal = nums[left];
                    while ((left < right && nums[left] == curVal)){
                        left++;
                    }
                }
            }
            //这里是将左手边固定值寻找下一个不等的数字。
            int curVal = nums[index];
            while(index < nums.length-2 && nums[index] == curVal){
                index++;
            }
        }
        return res;
    }
}
原文地址:https://www.cnblogs.com/ZJPaang/p/13186927.html