• 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;
        }
    }
    
  • 相关阅读:
    定时器
    js中script的上下放置区别 , Dom的增删改创建
    函数声明与应用
    常规选择器
    表格的制作
    流程控制
    For循环
    洛谷P1419寻找段落
    洛谷P1021邮票面值设计
    洛谷P3119草鉴定
  • 原文地址:https://www.cnblogs.com/ZJPaang/p/13186927.html
Copyright © 2020-2023  润新知