Leetcode 16. 最接近的三数之和
题目说明
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
示例:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。
提示:
3 <= nums.length <= 10^3
-10^3 <= nums[i] <= 10^3
-10^4 <= target <= 10^4
题目解析
- 双指针法
遍历数组,在未遍历的元素设置左右指针,比较遍历元素、左右指针的和与target的差值。 - 剪枝
若遍历的元素与之前元素相同,则continue。若所遍历的元素、左右指针的和与target相等,则直接返回。 - 时间复杂度 O( n 2 n^2 n2), 空间复杂度O(1)
Python代码
class Solution:
def threeSumClosest(self, nums: List[int], target: int) -> int:
nums = sorted(nums)
result = None
for i in range(len(nums) - 2):
if i > 0 and nums[i] == nums[i - 1]:
continue
l, r = i + 1, len(nums) - 1
while l < r:
mid_result = nums[i] + nums[l] + nums[r] - target
if not mid_result:
return target
if mid_result < 0:
l += 1
else:
r -= 1
result = mid_result + target if result is None or abs(result - target) > abs(mid_result) else result
return result