返回
剑指 LeetCode 16:最接近的三数之和
前端
2023-11-22 05:47:21
前言
欢迎来到「算法练习系列」的第26期,在这篇文章中,我们将共同学习如何解决LeetCode 16题——最接近的三数之和。
题目
题目: 最接近的三数之和
给定一个包含 n 个整数的数组 nums,和一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个整数的和。
示例:
输入:nums = [-1, 2, 1, -4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2)。
算法步骤
- 排序数组: 将数组 nums 按从小到大排序。
- 初始化三个指针: left、right 和 mid。将 left 指向数组的第一个元素,right 指向数组的最后一个元素,mid 指向数组的中间元素。
- 计算当前三个指针指向的元素的和: sum = nums[left] + nums[mid] + nums[right]。
- 比较 sum 和 target 的差值:
- 如果 sum 等于 target,则返回 sum。
- 如果 sum 大于 target,则将 right 指针向左移动一位。
- 如果 sum 小于 target,则将 left 指针向右移动一位。
- 重复步骤 3 和 4, 直到 left 指针和 right 指针相遇。
- 保存当前最接近 target 的和: 记录每一次计算出的 sum,并将与 target 差值最小的 sum 保存下来。
- 返回保存的和: 返回与 target 差值最小的 sum。
示例代码
def threeSumClosest(nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
# 排序数组
nums.sort()
# 初始化三个指针
left = 0
right = len(nums) - 1
mid = (left + right) // 2
# 初始化最小差值和最接近的目标值
min_diff = float('inf')
closest_sum = 0
# 循环遍历数组
while left < right:
# 计算当前三个指针指向的元素的和
sum = nums[left] + nums[mid] + nums[right]
# 比较 sum 和 target 的差值
diff = abs(sum - target)
if diff == 0:
# 如果 sum 等于 target,则返回 sum
return sum
elif diff < min_diff:
# 如果 sum 与 target 的差值小于最小差值,则更新最小差值和最接近的目标值
min_diff = diff
closest_sum = sum
if sum > target:
# 如果 sum 大于 target,则将 right 指针向左移动一位
right -= 1
else:
# 如果 sum 小于 target,则将 left 指针向右移动一位
left += 1
# 返回最接近的目标值
return closest_sum
结论
通过这篇「算法练习系列」文章,我们共同学习了如何解决LeetCode 16题——最接近的三数之和。我们从算法步骤入手,一步步分析了解决问题的思路,并通过示例代码展示了算法的实现过程。希望通过这篇文章,您能够更好地理解算法的本质,并在未来的算法学习中取得更大的进步。