今天做的而题目和昨天做的“寻找三个数之和”关联很强,所以一看到题目就想到用昨天的方法。
首先将数组按大小排序,确定待寻找a<=b<=c
三个数中的a
(即nums[i]
),即从nums
的最左端取到最右端。然后确定b
(即nums[l]
)和c
(即nums[r]
),其中b
为与a
相邻的右端第一个数,c
为数组最右端的数。
然后就是让b和c分别从左向右和从右向左移动,从而逼近target-a-b-c
的最小值。只里面有一个b和c移动的逻辑问题,一开始以为要根据target
的正负进行分类讨论,本子上写了一下发现,target-a-b-c>0
时,target>a+b+c
,此时将b
右移即可,并不需要讨论Orz
所以说,本子上写写画画还是比空想要靠谱啊~
class Solution:
def threeSumClosest(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
nums = sorted(nums)
nums_min = target - nums[0] - nums[1] - nums[2]
aim = nums[0] + nums[1] + nums[2]
if nums_min <0:
nums_min = -nums_min
if len(nums) == 3:
return aim
for i in range(len(nums)):
l = i+1
r = len(nums)-1
while l < r:
m = target - nums[i] - nums[r] - nums[l]
mid = m
if m < 0:
m = -m
if m == 0:
return nums[i] + nums[r] + nums[l]
if m < nums_min:
nums_min = m
aim = nums[i] + nums[r] + nums[l]
if mid > 0:
l += 1
elif mid < 0:
r -= 1
if i == len(nums) - 2:
break
return aim