当前位置: 首页 > 后端技术 > Python

LeetCode最接近的三个数之和

时间:2023-03-26 12:41:08 Python

最接近的三个数之和题目来源:https://leetcode-cn.com/problems/3sum-closest题目给定一个n个整数的数组nums和一个target值target。找到nums中的三个整数,使它们的和最接近目标。返回这三个数字的总和。假设每组输入只有一个答案。例如,给定一个数组nums=[-1,2,1,-4],target=1。最接近target的三个数之和为2。(-1+2+1=2)。解决思路数组排序+双指针;对数组进行排序,将返回值res初始化为float('inf')正无穷大,用于比较和赋值;遍历数组,按照以下步骤找到最接近的值:首先固定一个值nums[i],定义双指针L和R,分别指向固定值的下一位和最后一个值;考虑边界问题:取包括固定值在内的后面三位数字的和(因为数组是排序的,nums[i]+nums[L]+nums[L+1])就是当前最小值this_min,如果this_min大于target,就是说无论后面的值怎么组合,这个值都会大于this_min,所以这里直接比较this_min和res的差值和targetres的绝对值,取较小的值res,结束循环;取固定值和末尾最后两位的和作为当前最大值this_max,如果this_max小于target,说明后面的值更可能接近目标值。这里还要比较this_max和res与target之差的绝对值,res取较小的值,然后跳过。当没有边界问题时,在双指针之间遍历,计算固定值和双指针指向的值的和three_sum;当three_sum等于target时,直接返回target;当three_sum不等于target时,比较three_sum和res与target之差的绝对值,res取较小的值。当three_sum小于target时,左指针右移寻找更接近的值,注意去重;当three_sum大于target时,右指针向左移动以找到更接近的值,注意去重;在循环过程中取固定值时,要考虑避免重复固定值。时间复杂度:$O(n^2)$。代码实现类解决方案:defthreeSumClosest(self,nums:List[int],target:int)->int:#先对数组排序nums.sort()nl=len(nums)#初始化返回值为正无穷res=float('inf')foriinrange(nl-2):#如果i>0并且nums[i]==nums[i-1]:继续进行重复数据删除#定义双指针#左指针指向一个固定的valueNextbit#右指针指向末尾L,R=i+1,nl-1#处理边界问题this_min=nums[i]+nums[L]+nums[L+1]#数组有排序后,连续三位数字作为当前最小值#如果当前最小值大于目标,则后面的值与目标的差值会越来越大#比较当前最小值和返回值target与赋值后跳出循环的区别ifthis_min>target:if(this_min-target)