16.最接近的三数之和 python
最接近的三数之和
- 题目
- 题目描述
- 示例 1:
- 示例 2:
- 题目链接
- 题解
- Python 实现
- 解释
- 提交结果
题目
题目描述
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
示例 1:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2)。
示例 2:
输入:nums = [0,0,0], target = 1
输出:0
解释:与 target 最接近的和是 0(0 + 0 + 0 = 0)。
提示:
3 <= nums.length <= 1000
-1000 <= nums[i] <= 1000
-104 <= target <= 104
题目链接
最接近的三数之和
题解
要解决这个问题,可以使用类似于“三数之和”问题的双指针法。具体步骤如下:
- 排序数组:首先对数组进行排序,这样可以方便地使用双指针法。
- 固定一个数:遍历数组,固定一个数
nums[i]
。 - 使用双指针:对于固定的
nums[i]
,使用两个指针left
和right
分别指向i+1
和数组的末尾,寻找使三数之和最接近target
的组合。 - 更新最接近的和:在遍历过程中,不断更新最接近
target
的三数之和。
Python 实现
def threeSumClosest(nums, target):
nums.sort() # 对数组进行排序
n = len(nums)
closest_sum = float('inf') # 初始化最接近的和为一个很大的值
for i in range(n):
left, right = i + 1, n - 1
while left < right:
current_sum = nums[i] + nums[left] + nums[right]
if abs(current_sum - target) < abs(closest_sum - target):
closest_sum = current_sum
if current_sum < target:
left += 1 # 如果当前和小于目标值,移动左指针
elif current_sum > target:
right -= 1 # 如果当前和大于目标值,移动右指针
else:
return current_sum # 如果当前和等于目标值,直接返回
return closest_sum
解释
-
排序数组:
nums.sort()
对数组进行排序,使得后续的双指针操作更加方便。
-
固定一个数:
- 使用
for
循环遍历数组,固定一个数nums[i]
。
- 使用
-
使用双指针:
- 初始化两个指针
left
和right
,分别指向i+1
和数组的末尾。 - 计算当前三数之和
current_sum
。 - 如果
current_sum
更接近target
,更新closest_sum
。 - 根据
current_sum
与target
的关系,调整指针的位置:- 如果
current_sum < target
,移动左指针left
。 - 如果
current_sum > target
,移动右指针right
。 - 如果
current_sum == target
,直接返回current_sum
,因为这是最接近的和。
- 如果
- 初始化两个指针
-
返回结果:
- 遍历结束后,返回最接近
target
的三数之和closest_sum
。
- 遍历结束后,返回最接近
通过这种方法,可以在 O(n^2) 的时间复杂度内解决问题,效率较高。