文章目录
1. 任务
学习哈希表,完成LeetCode上的第一题两数之和,要求哈希表实现!!
2. 要求
哈希表学习心得笔记+LeetCode提交结果与代码
3. 哈希表
哈希表也叫散列表,哈希表是根据关键值(key)来直接访问目标值(value)的一种数据结构,其特点就在于能够快捷的实现信息的查询和检索。
3.1 【举个栗子】——手机通讯录
我们输入一个联系人的姓名,就能返回相应的电话号码。用哈希表实现的过程就是,将联系人姓名的字符通过一个哈希函数,映射成一个整数(哈希码),然后根据哈希码来索引出电话号码。比如哈希码为5,就表示是在存储位置为5,因此我们就能直接取出该位置的值,并返回结果。
3.2 哈希函数的构建需要满足的条件
- 同一个键每次输入到哈希函数中,其对应的哈希码也必须相同;
- 不同键对应的哈希码不能相同。
3.3 哈希对不同的关键字,可能得到同一个散列地址,即同一个数组下标,这种现象称为冲突,那么我们该如何去处理冲突呢?
3.3.1 开放地址法
通过系统的方法找到数组的另一个空位,把数据填入,而不再用哈希函数得到的数组下标,因为该位置已经有数据了;
- 线性探测法
所谓线性探测,即线性地查找空白单元。我举个例子,如果21是要插入数据的位置,但是它已经被占用了,那么就是用22,然后23,以此类推。数组下标一直递增,直到找到空白位。 - 再哈希法
为了消除原始聚集和二次聚集,现在需要的一种方法是产生一种依赖关键字的探测序列,而不是每个关键字都一样。即:不同的关键字即使映射到相同的数组下标,也可以使用不同的探测序列。再哈希法就是把关键字用不同的哈希函数再做一遍哈希化,用这个结果作为步长,对于指定的关键字,步长在整个探测中是不变的,不同关键字使用不同的步长、经验说明,第二个哈希函数必须具备如下特点:
1. 和第一个哈希函数不同;
2. 不能输出0(否则没有步长,每次探索都是原地踏步,算法将进入死循环)。
3.3.2 链地址法
通过创建一个存放链表的数组,数组内不直接存储数据,这样当发生冲突时,新的数据项直接接到这个数组下标所指的链表中。
4. 两数之和
4.1 任务
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
4.2 题目描述
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
n = len(nums)# 定义循环次数为数组的长度
for x in range(n): #遍历
b = target-nums[x] #目标值-当前遍历的值
if b in nums: # 判断b是否在数组中
y = nums.index(b)# 在数组中就返回
if y!=x:
return x,y