数据结构与算法之 leetcode 哈希表四数相加去重 排序后遍历

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


摘要:

在LeetCode中,四数相加去重是一个经典的哈希表问题。该问题要求我们找出所有唯一且相加等于目标值的四个数字对。本文将深入解析该问题,并使用排序后遍历的方法结合哈希表来解决,同时提供详细的代码实现和性能分析。

一、问题背景

四数相加去重问题来源于LeetCode的第18题,题目描述如下:

给定一个整数数组nums和一个目标值target,找出所有唯一且相加等于target的四元数。

示例:

输入:nums = [1, 2, 2, 2, 3, 4, 4, 5, 5], target = 8

输出:[[1, 1, 2, 4], [1, 2, 3, 2], [2, 2, 2, 2], [2, 3, 3, 1]]

二、解决方案

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

1. 对数组进行排序,这样我们可以通过固定两个指针来遍历可能的四元数对。

2. 使用哈希表来存储已经遍历过的三元数对,以避免重复计算。

3. 遍历数组,对于每个元素,使用两个指针分别指向当前元素后面的元素和数组的最后一个元素,尝试找到满足条件的四元数对。

三、代码实现

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

python

def fourSum(nums, target):


nums.sort() 对数组进行排序


result = []


seen = set() 使用集合来存储已经遍历过的三元数对

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]])


避免重复的三元数对


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


left += 1


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


right -= 1


left += 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 = 8


print(fourSum(nums, target))


四、性能分析

1. 时间复杂度:O(n^3),其中n是数组的长度。排序操作的时间复杂度为O(nlogn),遍历数组的时间复杂度为O(n),对于每个元素,我们使用两个指针进行遍历,时间复杂度为O(n^2)。

2. 空间复杂度:O(n),排序操作需要额外的空间,哈希表用于存储已经遍历过的三元数对。

五、总结

本文通过分析LeetCode中的四数相加去重问题,介绍了使用排序后遍历结合哈希表的方法来解决该问题。通过代码实现和性能分析,我们了解了该方法的优缺点,并能够将其应用于实际编程中。

注意:本文代码仅为示例,实际应用中可能需要根据具体情况进行调整。