zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
  • 相关阅读:
    Atitit 图像处理类库 halcon11  安装与环境搭建attilax总结
    Atitit  undac网络设备管理法案 (路由器 交换机等)    法案编号USRr101510
    Atitit 图像处理 halcon类库的使用  范例边缘检测 attilax总结
    Atitit Seed-Filling种子填充算法attilax总结
    Atitti 图像处理 特征提取的科技树 attilax总结
    Atitit 软件体系的进化,是否需要一个处理中心
    Atitit 项目的主体设计与结构文档 v5
    Atitti 过程导向 vs 结果导向 attilax的策略
    Atitti 过程导向 vs 结果导向 attlax的策
    Atitit 版本管理----分支管理
  • 原文地址:https://www.cnblogs.com/ZJPaang/p/13186927.html
Copyright © 2011-2022 走看看