1、题目如下:
2、个人Python代码实现
本题的思路应该与很早之前刷的第15题三数之和是一个思路:
1、先将数组排序,然后进行遍历数组
2、确定左指针、右指针
3、判断三个数之和是否接近目标值
4、重点是,为确保左右指针不是同一个元素,所以在条件判断中均不可忽略左右指针是否为同一元素
提交代码如下:
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort() #将数组排序
temp = float('inf') #临时变量,用于保存子数组之和与target的差值,取差值最小值就是本题的最接近的和
res = [] #当temp为较小值时,更新res中的元素,当循环完成后,res中的三个数之和就与target最接近
for i in range(len(nums)): #遍历数组
l = i + 1 #左指针为当前元素右方的第一个元素
r = len(nums) - 1 #右指针为nums最后一个元素
while l < r:
#当三个数之和小于target的时候
#先判断三数之和与target差值的绝对值是否小于temp,如果小于temp,则更新temp和res
#再将左指针右移
if nums[i] + nums[l] + nums[r] < target and l != r:
if abs(nums[i] + nums[l] + nums[r] - target) < temp:
temp = abs(nums[i] + nums[l] + nums[r] - target)
res = [nums[i], nums[l], nums[r]]
l += 1
#当三个数之和大于target的时候
#先判断三数之和与target差值的绝对值是否小于temp,如果小于temp,则更新temp和res
#再将右指针左移
elif nums[i] + nums[l] + nums[r] > target and l != r:
if abs(nums[i] + nums[l] + nums[r] - target) < temp:
temp = abs(nums[i] + nums[l] + nums[r] - target)
res = [nums[i], nums[l], nums[r]]
r -= 1
#当三个数之和小于target的时候
#先判断三数之和与target差值的绝对值等于temp,退出循环
elif nums[i] + nums[l] + nums[r] == target and l != r:
res = [nums[i], nums[l], nums[r]]
break
return sum(res)