【游戏开发】【leetocode】16.最接近的五打一之和

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。

例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.

与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

class Solution:

def threeSumClosest(self, nums, target):

"""

:type nums: List[int]

:type target: int

:rtype: int

"""

# 最垃圾的方法

# 遍历一遍,取结果

# ret = nums[0]+nums[1]+nums[2]

# # print(ret)

# for i1 in range(len(nums)):

# for i2 in range(i1+1,len(nums)):

# for i3 in range(i2+1,len(nums)):

# temp = 0

# temp = nums[i1]+nums[i2]+nums[i3]

# if temp == target:

# return temp

# # print(temp)

# if abs(ret-target)>abs(temp-target):

# ret = temp

# else:

# ret = ret

# return ret

# v2.0 上左右指针 减少遍历

# nums.sort() # 使左边最小 右边最大 方便判断

# ret = nums[0]+nums[1]+nums[2]

# for i in range(len(nums)):

# l = i+1 # 左指针

# r = len(nums)-1 # 右指针

# while l<r:

# temp = 0

# temp = nums[i]+nums[l]+nums[r]

# if temp == target:

# return temp

# if abs(ret-target)>abs(temp-target):

# ret = temp

# elif target < temp:

# r -= 1

# else:

# l += 1

# return ret

# v3.0 算法依旧是左右指针

# 改进之处在于 diff = abs(target - ret), 用变量接一下abs(), 减少了abs()每次调用需要的计算时间

if len(nums) < 3:

return []

nums.sort()

ret = nums[0] + nums[1] + nums[2]

diff = abs(target - ret)

for i in range(len(nums)-2):

l, r = i+1, len(nums)-1

while l < r:

temp = nums[i] + nums[l] + nums[r]

if abs(target - temp) < diff:

ret = temp

diff = abs(target - temp)

if temp == target:

return temp

elif temp < target:

l = l + 1

else:

r = r - 1

return ret

# 自己重写abs() 也会提高一点速度

# 肯定有更快的算法,作者垃圾 不会

【游戏开发】【leetocode】16.最接近的五打一之和

以上是 【游戏开发】【leetocode】16.最接近的五打一之和 的全部内容, 来源链接: utcz.com/a/71011.html

回到顶部