最接近的三数之和
Posted wuyouwei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最接近的三数之和相关的知识,希望对你有一定的参考价值。
给定一个包括 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; }
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum-closest
以上是关于最接近的三数之和的主要内容,如果未能解决你的问题,请参考以下文章
最接近的三数之和,完整代码实现,java及python实现。
最接近的三数之和,完整代码实现,java及python实现。