数据结构与算法之 leetcode 哈希表四数之和 II 去重 双哈希表

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


摘要:

在LeetCode中,四数之和 II 去重是一个经典的算法问题。该问题要求在给定一个整数数组和一个目标值,找出所有唯一且不重复的四元组,使得这四个数相加等于目标值。本文将围绕这一主题,探讨如何使用双哈希表的方法来解决该问题,并分析其时间复杂度和空间复杂度。

一、问题背景

四数之和 II 去重问题是一个典型的组合问题,要求在数组中找出所有唯一且不重复的四元组,其和等于目标值。该问题在LeetCode的难度为中等,但解决方法具有一定的技巧性。

二、双哈希表方法

双哈希表方法是一种高效解决四数之和 II 去重问题的算法。其核心思想是利用两个哈希表分别存储两个数对的和以及对应的索引,从而快速查找满足条件的四元组。

1. 算法步骤

(1)初始化两个哈希表:hashMap1用于存储两个数对的和以及对应的索引,hashMap2用于存储两个数对的和的逆序以及对应的索引。

(2)遍历数组,对于每个元素,计算其与目标值之差,并查找该差值在hashMap1中是否存在。如果存在,则将对应的索引与当前索引组成一个四元组。

(3)对于每个找到的四元组,检查其是否重复。如果重复,则跳过;如果不重复,则将其添加到结果集中。

(4)遍历hashMap2,对于每个键值对,计算其键与目标值之差,并查找该差值在hashMap1中是否存在。如果存在,则将对应的索引与当前索引组成一个四元组。

(5)重复步骤(3),检查四元组是否重复,并添加到结果集中。

(6)返回结果集。

2. 代码实现

python

def fourSumII(nums, target):


hashMap1 = {}


hashMap2 = {}


result = []

for i in range(len(nums)):


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


sum = nums[i] + nums[j]


if sum in hashMap1:


for index in hashMap1[sum]:


result.append([nums[index], nums[index + 1], nums[i], nums[j]])


else:


hashMap1[sum] = [i, j]

for i in range(len(nums)):


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


sum = nums[i] + nums[j]


if target - sum in hashMap2:


for index in hashMap2[target - sum]:


result.append([nums[index], nums[index + 1], nums[i], nums[j]])


else:


hashMap2[target - sum] = [i, j]

return list(set(result))

测试代码


nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]


target = 10


print(fourSumII(nums, target))


三、时间复杂度和空间复杂度分析

1. 时间复杂度

双哈希表方法的时间复杂度为O(n^2),其中n为输入数组的长度。这是因为我们需要遍历数组中的每个元素,并计算其与目标值之差,然后查找该差值在哈希表中的索引。

2. 空间复杂度

双哈希表方法的空间复杂度为O(n^2),其中n为输入数组的长度。这是因为我们需要存储两个哈希表,分别用于存储两个数对的和以及对应的索引。

四、总结

本文介绍了双哈希表方法在LeetCode四数之和 II 去重问题中的应用。该方法通过利用两个哈希表分别存储两个数对的和以及对应的索引,实现了快速查找满足条件的四元组。该方法具有时间复杂度和空间复杂度较低的特点,适用于解决大规模数据集的四数之和 II 去重问题。