数据结构与算法之 leetcode 数组三数之和最接近 排序后双指针

数据结构与算法阿木 发布于 2025-07-12 9 次阅读


摘要:

在LeetCode中,数组三数之和问题是一个经典的问题,要求找出数组中任意三个数,使得它们的和与目标值最接近。本文将围绕这一主题,深入解析排序后双指针法的原理,并给出相应的代码实现。文章将从问题背景、算法思路、代码实现以及性能分析等方面进行详细阐述。

一、问题背景

给定一个整数数组和一个目标值target,找出数组中任意三个数,使得它们的和与target最接近。返回这三个数的和。

示例:

输入:nums = [-1, 2, 1, -4], target = 1

输出:2

解释:与target最接近的和为2,即-1 + 2 + 1 = 2。

二、算法思路

1. 对数组进行排序,以便使用双指针法。

2. 初始化left指针指向数组的第一个元素,right指针指向数组的最后一个元素。

3. 遍历数组,对于每个元素nums[i],使用双指针法找到最接近target的三个数。

4. 比较当前和与target的差值,如果更接近,则更新最接近的和。

5. 移动left或right指针,尝试找到更接近的和。

6. 重复步骤3-5,直到left指针大于right指针。

三、代码实现

python

def threeSumClosest(nums, target):


对数组进行排序


nums.sort()


初始化最接近的和为无穷大


closest_sum = float('inf')


遍历数组


for i in range(len(nums) - 2):


初始化left和right指针


left, right = i + 1, len(nums) - 1


使用双指针法找到最接近的和


while left < right:


current_sum = nums[i] + nums[left] + nums[right]


如果当前和与target的差值小于最接近的和的差值,则更新最接近的和


if abs(current_sum - target) < abs(closest_sum - target):


closest_sum = current_sum


如果当前和大于target,则移动right指针


elif current_sum > target:


right -= 1


如果当前和小于target,则移动left指针


else:


left += 1


return closest_sum

测试代码


nums = [-1, 2, 1, -4]


target = 1


print(threeSumClosest(nums, target)) 输出:2


四、性能分析

1. 时间复杂度:O(n^2),其中n是数组的长度。排序操作的时间复杂度为O(nlogn),双指针遍历的时间复杂度为O(n)。

2. 空间复杂度:O(1),除了输入数组外,不需要额外的空间。

五、总结

本文详细解析了LeetCode数组三数之和最接近问题,并介绍了排序后双指针法的原理和代码实现。通过分析算法的时间复杂度和空间复杂度,我们可以了解到该算法在处理大数据量时的效率。在实际应用中,我们可以根据具体问题选择合适的算法,以达到最优的性能。