给定一个包括
n
个整数的数组nums
和 一个目标值target
。找出nums
中的三个整数,使得它们的和与target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
提示:
- 3 <= nums.length <= 103
- -103 <= nums[i] <= 103
- -104 <= target <= 104
商业转载请联系官方授权,非商业转载请注明出处。
def threeSumClosest(nums: list, target: int) -> int:
# 简单情况处理
# 题约束了nums.length>=3
len=nums.__len__()
if len==3: return sum(nums)
# 这题不能用dict,它是找最接近而不是找确定的值,left计算出来,dict找最接近是很难找的,遍历不方便
# list排过序后,倒是可以O(n^2*logn),left用二分找最接近的,先看看超不超时
# 注意,遍历还是会出现排列组合的情况,保持答案[x,y,left]递增
nums.sort()
x=y=0
left=0
res=nums[0]+nums[1]+nums[2]
while x<len:
y=x+1
while y<len:
left=target-(nums[x]+nums[y])
# [y+1,len)中找最接近left的
l=y+1;r=len-1;mid=int((l+r)/2)
while l<=r:
if l==r:
res=nums[x]+nums[y]+nums[mid] if abs(nums[x]+nums[y]+nums[mid]-target)<abs(res-target) else res
break
# [l,mid]
v_lmid=nums[int((l+mid)/2)]
abs_l=abs(v_lmid - left)
### 错误 - 1
## [mid+1,r]
#v_rmid=nums[int((mid+1+r)/2)]
# [mid,r]
v_rmid=nums[int((mid+r)/2)]
### 错误 - 1
abs_r=abs(v_rmid - left)
if abs_l<=abs_r:
r=mid;mid=int((l+r)/2)
else:
### 错误 - 1
# l=mid+1;mid=int((l+r)/2)
l=mid;mid=int((l+r)/2)
### 错误 - 1
y+=1
x+=1
return res
奇怪,debug中,对不上行,且运行逻辑混乱,这是pycharm的bug吗?