数据结构与算法之 leetcode 数组三数之和最小 最接近目标值

数据结构与算法阿木 发布于 4 天前 1 次阅读


摘要:

在LeetCode中,数组三数之和问题是一个经典的问题,它要求找出数组中任意三个数之和最小的组合,或者是最接近给定目标值的组合。本文将深入解析这一问题的解法,包括暴力解法、双指针法和哈希表法,并通过代码实现来展示这些方法。

一、问题背景

给定一个整数数组 `nums` 和一个整数 `target`,找出数组中任意三个数之和最小的组合,或者是最接近给定目标值的组合。返回这个组合的和。

示例:


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


输出:[-1, 2, 1]


解释:三个数之和为 -1 + 2 + 1 = 2,这是最接近 1 的和。

输入:nums = [1, 2, 4, 8, 16, 32, 64, 128], target = 900


输出:[32, 64, 128]


解释:三个数之和为 32 + 64 + 128 = 224,这是最接近 900 的和。


二、解法分析

1. 暴力解法

暴力解法是最直观的方法,通过三层嵌套循环遍历所有可能的三个数的组合,然后计算它们的和,最后比较哪个组合的和最小。

2. 双指针法

双指针法利用了排序后的数组特性,通过一次遍历和两个指针的移动来找到和最小的组合。

3. 哈希表法

哈希表法通过存储所有可能的两个数之和以及它们与目标值的差,来快速找到最接近目标值的组合。

三、代码实现

1. 暴力解法

python

def threeSum(nums, target):


nums.sort()


result = []


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


for j in range(i + 1, len(nums) - 1):


for k in range(j + 1, len(nums)):


if nums[i] + nums[j] + nums[k] == target:


return [nums[i], nums[j], nums[k]]


elif nums[i] + nums[j] + nums[k] < target:


result = [nums[i], nums[j], nums[k]]


return result


2. 双指针法

python

def threeSumClosest(nums, target):


nums.sort()


result = float('inf')


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


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


while left < right:


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


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


result = current_sum


if current_sum < target:


left += 1


elif current_sum > target:


right -= 1


else:


return current_sum


return result


3. 哈希表法

python

def threeSumClosest(nums, target):


nums.sort()


result = float('inf')


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


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


while left < right:


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


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


result = current_sum


if current_sum < target:


left += 1


elif current_sum > target:


right -= 1


else:


return current_sum


return result


四、总结

本文对LeetCode中的数组三数之和最小(最接近目标值)问题进行了详细的分析,并提供了三种不同的解法。暴力解法虽然简单易懂,但效率较低;双指针法在排序后可以有效地减少不必要的计算;哈希表法虽然可以快速找到最接近目标值的组合,但实现起来相对复杂。在实际应用中,可以根据具体情况进行选择。