• 最接近的三数之和(leetcode16)


    给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

    示例:

    输入:nums = [-1,2,1,-4], target = 1
    输出:2
    解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

    解析:

    题目要求找到与目标值target 最接近的三元组,这里的「最接近」即为差值的绝对值最小。

    可以先考虑对整个数组进行升序排序,这样一来:

    假设数组的长度为 n,我们先枚举 a,它在数组中的位置为 i;

    为了防止重复枚举,我们在位置 [i+1, n) 的范围内枚举 b 和 c。

    初始时,pb指向位置 i+1,即左边界;

    pc指向位置 n-1,即右边界。

    在每一步枚举的过程中,我们用 a+b+c 来更新答案,

    并且:如果 a+b+c≥target,那么就将pc向左移动一个位置;

    如果a+b+c<target,那么就将 pb向右移动一个位置。

    代码如下

    public class leetcode16 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            Scanner in = new Scanner(System.in);
            String input = in.nextLine();
            List<String> list = Arrays.asList(input.split(","));
            int[] nums = new int[list.size()];
            for(int i=0;i<list.size();i++){
                nums[i]=Integer.parseInt(list.get(i));
            }
            
            int target = Integer.parseInt(in.nextLine());
            int result = threeSumClosest(nums,target);
            System.out.println(result);
        }
        
        public static 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;
        }
    
    }
  • 相关阅读:
    IntelliJ IDEA 创建 hello world Java web Maven项目从头到尾都有图有真相2017版本
    artifact什么意思--刚刚搞web开发的同学可能要问个为什么
    《亲测 已解决》Address localhost:8080 is already in used
    Linux CentOS 服务器搭建与初始化配置图文详解
    CentOS下安装JDK的三种方法
    关于tomcat成功启动但访问不了欢迎界面的问题
    Mac系统安装和配置tomcat步骤详解
    mac jenkins环境安装及jenkins使用(未完待续)
    github初始密码查看
    github公钥私钥
  • 原文地址:https://www.cnblogs.com/Vincent-yuan/p/14413875.html
Copyright © 2020-2023  润新知