数据结构与算法之 leetcode 哈希表四数之和去重 排序 + 双指针

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


LeetCode 哈希表四数之和去重(排序 + 双指针)解题分析及代码实现

在 LeetCode 中,四数之和是一个经典的算法问题。题目要求找出所有唯一且不同的四元组,使得这四个数字的和等于一个给定的目标值。去重是解决此类问题的关键,尤其是在存在重复元素的情况下。本文将围绕“哈希表四数之和去重”这一主题,结合排序和双指针技术,详细分析并实现一个高效的解决方案。

问题分析

给定一个整数数组 `nums` 和一个目标值 `target`,找出所有唯一且不同的四元组,使得这四个数字的和等于 `target`。注意,每个元素在四元组中只能使用一次,且四元组的顺序可以任意。

输入:


nums = [1, 2, 2, 2, 3, 4, 4, 5, 5]


target = 9


输出:


[[1, 2, 3, 4], [1, 2, 4, 2], [2, 2, 3, 2], [2, 2, 4, 1], [2, 3, 2, 2], [2, 3, 4, 0], [2, 4, 2, 1], [3, 2, 2, 2], [3, 2, 4, 0], [3, 4, 2, 0], [4, 2, 2, 1], [4, 2, 3, 0], [4, 3, 2, 0]]


注意事项:

1. 结果中的四元组必须唯一,即不允许重复的四元组。

2. 四元组的顺序可以任意。

解题思路

为了解决这个问题,我们可以采用以下步骤:

1. 排序:首先对数组进行排序,这样我们可以利用双指针技术来减少不必要的重复计算。

2. 去重:在遍历数组的过程中,跳过重复的元素,确保四元组的唯一性。

3. 双指针:对于每个固定的第一个元素,使用双指针来寻找剩下的三个元素,使得它们的和等于 `target - nums[i]`。

代码实现

下面是使用 Python 实现的代码:

python

def fourSum(nums, target):


nums.sort() 排序


result = []


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


跳过重复的元素


if i > 0 and nums[i] == nums[i - 1]:


continue


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


跳过重复的元素


if j > i + 1 and nums[j] == nums[j - 1]:


continue


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


while left < right:


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


if current_sum == target:


result.append([nums[i], nums[j], nums[left], nums[right]])


left += 1


right -= 1


跳过重复的元素


while left < right and nums[left] == nums[left - 1]:


left += 1


while left < right and nums[right] == nums[right + 1]:


right -= 1


elif current_sum < target:


left += 1


else:


right -= 1


return result

测试代码


nums = [1, 2, 2, 2, 3, 4, 4, 5, 5]


target = 9


print(fourSum(nums, target))


总结

本文通过分析 LeetCode 中的四数之和问题,结合排序和双指针技术,实现了一个高效的去重解决方案。在实现过程中,我们注意了去重和排序的细节,确保了结果的正确性和效率。通过这种方式,我们可以更好地理解和应用哈希表、排序和双指针等算法技术。