数据结构与算法之 leetcode 哈希表两数之和算法 哈希集合查找

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


LeetCode:两数之和算法——哈希集合查找实现

LeetCode 是一个在线编程社区,提供了大量的编程题目,旨在帮助程序员提高编程技能。其中,“两数之和”是 LeetCode 上的一道经典算法题,主要考察了哈希表(Hash Table)的应用。本文将围绕这一主题,详细解析两数之和算法,并使用哈希集合查找的方法进行实现。

问题分析

题目描述:给定一个整数数组 `nums` 和一个目标值 `target`,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。你不能重复利用这个数组中同样的元素。

示例:


输入:nums = [2, 7, 11, 15], target = 9


输出:[0, 1]


解释:因为 nums[0] + nums[1] = 2 + 7 = 9,返回 [0, 1]。


哈希表简介

哈希表(Hash Table)是一种基于散列原理的数据结构,它通过散列函数将键映射到表中的位置。哈希表具有以下特点:

1. 查找、插入和删除操作的平均时间复杂度为 O(1)。

2. 哈希表可以存储大量的键值对。

3. 哈希表可能会发生哈希冲突。

哈希集合查找

在两数之和算法中,我们可以使用哈希集合(HashSet)来存储已经遍历过的数字,并检查当前数字与目标值之差是否已经存在于哈希集合中。如果存在,则找到了一对符合条件的数字;如果不存在,则将当前数字添加到哈希集合中,并继续遍历。

代码实现

以下是用 Python 实现的两数之和算法:

python

def twoSum(nums, target):


hash_set = set()


for i, num in enumerate(nums):


complement = target - num


if complement in hash_set:


return [nums.index(complement), i]


hash_set.add(num)


return []

测试代码


nums = [2, 7, 11, 15]


target = 9


print(twoSum(nums, target)) 输出:[0, 1]


代码解析

1. 初始化哈希集合:创建一个空集合 `hash_set` 用于存储已经遍历过的数字。

2. 遍历数组:使用 `enumerate` 函数遍历数组 `nums`,获取每个数字的索引 `i` 和值 `num`。

3. 计算补数:计算当前数字 `num` 与目标值 `target` 之差,得到补数 `complement`。

4. 检查哈希集合:判断补数 `complement` 是否存在于哈希集合中。如果存在,则找到了一对符合条件的数字,返回它们的索引;如果不存在,则将当前数字 `num` 添加到哈希集合中。

5. 返回结果:如果遍历完数组后仍未找到符合条件的数字,则返回空列表。

优化

1. 去重:在添加数字到哈希集合之前,可以先检查该数字是否已经存在于哈希集合中,以避免重复添加。

2. 使用字典:使用字典(Dictionary)代替哈希集合,可以更方便地获取数字的索引。

总结

本文详细解析了 LeetCode 上的两数之和算法,并使用哈希集合查找的方法进行了实现。通过哈希表,我们可以快速查找符合条件的数字,从而提高算法的效率。在实际应用中,我们可以根据具体需求对算法进行优化,以达到更好的性能。