题目:
思路:
这一题与上一题类似,上一题我没有做出来,看了题解中大神的做法,先对原序列进行排序,然后利用当前指针向右遍历,当前指针右侧的左(当前指针+1)右(len(nums)-1)双指针遍历当前指针右侧的所有值,当三数之和大于0,证明当前右指针的值太大,right =right-1,反之,left = left-1,这题我也采用了类似的思路。
代码:
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
length = len(nums)
if length ==3:
return nums[0]+nums[1]+nums[2]#如果nums长为3,直接返回三数之和
nums.sort() #将nums变成有序数组
templist = []
nowpoint,temp = 0,0
while nowpoint <=(length-3): #nowpoiont从左向右遍历
left = nowpoint+1
right = length-1
if nowpoint==0: #使得templist中有初值
temp = nums[nowpoint]+nums[left]+nums[right]-target
templist.append(temp) #用abs(temp)衡量三数之和与target的差值
while left <right:
sum_num = nums[nowpoint]+nums[left]+nums[right]
temp=sum_num-target
if abs(temp) <= abs(templist[0]): #用abs(temp)衡量三数之和与target的差值
templist.clear()
templist.append(temp)
if temp == 0:
return sum_num
elif temp>0: #如果差值大于0,说明nums[right]太大,right往左移动一位
right -=1
else: #如果差值小于0,说明nums[left]太小,left往右移动一位
left +=1
nowpoint +=1
return templist[0]+target
大神代码:
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
n = len(nums)
res = nums[0] + nums[1] + nums[2]
for i in range(n):
left, right = i+1, n-1
while left < right:
sum = nums[i] + nums[left] + nums[right]
if abs(target-sum) < abs(target-res):
res = sum
if sum > target:
right -= 1
elif sum < target:
left += 1
else:
return res
return res