今天每日一练时这道题翻车了,记录一下。
开始我还以为题出错了,没有正确答案,我理解成了,和tartget目标值最接近的三个数的和,结果应该是三个数的和和target最接近。
nums是输入的一个列表,长度大于等于三,target是你输入的目标数字,要求是得出nums中三个元素之和最接近target的值。
from typing import List
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort() # 给列表正排序
cur = 0 # 游标初始为索引0
closest = nums[0] + nums[1] + nums[2] # 初始取前三位默认最接近
while cur < len(nums) - 2: # 因为是取三位数,游标最大取到总长度-3的位置,因为此判断没有等号,所以最大长度-2
left = cur + 1 # 游标后一位
right = len(nums) - 1 # 最后一位元素索引
while left < right:
n = nums[cur] + nums[left] + nums[right]
if abs(target - n) < abs(target - closest):
closest = n # 这三个数比初始的更接近目标值的话替换之前的closest
if n == target: # 这三个数刚好等于目标值的话可以break退出了
break
elif n > target:
t = right - 1 # 这三个数大于目标值的话最大的元素索引向左移动一位
while (t > left and nums[t] == nums[right]):
t -= 1 # 最大的元素索引向左移动直到第一个不等于他且小于他的位置
right = t
else:
t = left + 1
while (t < right and nums[t] == nums[left]):
t += 1 # 最小的元素索引向右移动直到第一个不等于他且大于他的位置
left = t
t = cur + 1
while (t < len(nums) and nums[t] == nums[cur]):
t += 1
cur = t # 游标每次循环向右移动
return closest
# %%
s = Solution()
print(s.threeSumClosest(nums = [-1,2,1,-4], target = 3))
转自:python 每日一练