zoukankan      html  css  js  c++  java
  • 最接近的三数之和

    给定一个包括 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 res=nums[0]+nums[1]+nums[2];
            /*数组长度*/
            int length=nums.length;
            /*定义三个指针k,i,j,从最小值开始,i始终从k+1开始,j则从最大值开始*/
            for(int k=0;k<length-2;k++){
                int i=k+1;
                int j=length-1;
                /*循环内遍历当i不等于j时继续遍历*/
                while (i!=j){
                    /*获取当前的最小值*/
                    int min=nums[k]+nums[i]+nums[i+1];
                    /*当目标值小于最小值时,到后面差值会越来越大,故break,后面的可以不用考虑了*/
                    if(target<min){
                        /*当返回值与目标的差额比当前最小值与目标的差额大时,赋值返回值为当前最小值*/
                        if(Math.abs(res-target)>Math.abs(min-target)){
                            res= min;
                        }
                        break;
                    }
                    /*获取当前的最大值*/
                    int max=nums[k]+nums[j]+nums[j-1];
                    /*当目标值大于最大值时,到后面差值会越来越大,故break,后面的可以不用考虑了*/
                    if(target>max){
                        /*当返回值与目标的差额比当前最大值与目标的差额大时,赋值返回值为当前最大值*/
                        if(Math.abs(res-target)>Math.abs(max-target)){
                            res=max;
                        }
                        break;
                    }
                    /*当前值总和*/
                    int sum=nums[k]+nums[i]+nums[j];
                    /*当返回值与目标的差额比当前值与目标的差额大时,赋值返回值为当前值*/
                     if(Math.abs(res-target)>Math.abs(sum-target)){
                         res=sum;
                     }
                     /*当前值大于目标值时,j减小,并去除重复的j的值*/
                     if(sum>target){
                         j--;
                         while (i!=j&&nums[j]==nums[j+1]){
                             j--;
                         }
                     }else if(Math.abs(sum-target)==0){
                         /*当前值与目标值的差值为0时,直接返回*/
                         return sum;
                     }else{
                         /*当前值小于目标值时,i增加,并去除重复的i值*/
                         i++;
                         while (i!=j&&nums[i]==nums[i-1]){
                             i++;
                         }
                     }
                }
                /*去除重复的k的值*/
                while (k<length-2&&nums[k]==nums[k+1]){
                    k++;
                }
            }
            return res;
        }
    View Code

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/3sum-closest

  • 相关阅读:
    4.3 DDL 数据类型
    Log4j的简要概述
    Eclipse/IDEA使用小技巧
    idea-生成key的Java代码
    Java8新特性--lamada详解
    JQuery基本语法
    EL与Velocity基本语法总结:
    RAF(RandomAccessFile)类
    Java篇-File类之常用操作
    Java篇-File类之创建删除
  • 原文地址:https://www.cnblogs.com/wuyouwei/p/11872396.html
Copyright © 2011-2022 走看看