【题目】
【思路】
先将nums排序,计算temp = nums[i]+nums[left]+nums[right]。
判断若temp>target,那就希望temp小一点,right左移(变小)。
【python】
class Solution(object):
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
#先将数排序
nums.sort()
#初始化res,用前三个数之和
res = sum(nums[:3])
#i遍历nums,每次循环left和right分别向中间移动
for i in range(len(nums)):
left = i+1
right = len(nums)-1
while left<right:
temp = nums[i]+nums[left]+nums[right]
#abs相减判断,res替换更接近target的值
if abs(res-target) > abs(temp-target):
res = temp
#判断是left右移还是right左移
if temp>target:
right = right-1
else:
left = left+1
return res
【结果】
【学习大牛代码】
class Solution(object):
def threeSumClosest(self, nums, target):
nums.sort()
length = len(nums)
closest = []
for i in range(length-2):
left = i+1
right = length-1
#先计算nums[i]对应最小的三数和,如果最小都大于target则直接添加
if nums[i] + nums[left] + nums[left+1] > target:
closest.append(nums[i] + nums[left] + nums[left+1])
#计算nums[i]对应最大的三数和,如果最大都小于target则直接添加
elif nums[i] + nums[right] + nums[right-1] < target:
closest.append(nums[i] + nums[right] + nums[right-1])
#否则按照原来方法逐个计算每个三数和
else:
while left < right:
closest.append(nums[i] + nums[left] + nums[right])
if closest[-1] < target:
left += 1
elif closest[-1] > target:
right -= 1
else:
return target
#closest按照离target最近的条件排序,返回最接近target的值
closest.sort(key=lambda x: abs(x-target))
return closest[0]
【提交结果】
【总结】
closest.sort(key=lambda x: abs(x-target))采用了sort排序:自定规则的条件排序。
key=lambda x: 是固定的格式,x是列表的元素
abs(x-target) : 用x和target的距离为自定的排序规则