Leetcode 16.最接近的三数之和
1 题目描述(Leetcode题目链接)
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
2 题解
借鉴之前做过类似题的思路,本题可以使用双指针的方法来解决。
- 对数组进行排序;
- 令返回值为正无穷大;
- 从第一个数组元素开始,每次固定一个数组元素,然后对该数组元素后面的所有元素使用双指针,每次判断当前固定的数组元素以及双指针的两个元素之和是否距离target更近,如果更近则更新返回值,如果等于target则直接返回target;
- 判断这三个数之和与target的大小,如果大于target则右指针向左移动,反之左指针向右移动;
另外在每次固定元素的时候可以判断当前元素和前一个元素是否相等,如果相等则直接continue,用于去冗余。
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums.sort()
length = len(nums)
retv = float("-inf")
for i in range(length - 2):
if nums[i] == nums[i-1] and i > 0: # 去冗余
continue
left, right = i + 1, length - 1
while left < right:
x = nums[i] + nums[left] + nums[right]
if x == target:
return target
elif x > target:
right -= 1
else:
left += 1
if abs(x - target) < abs(retv - target):
retv = x
return retv