LeetCode刷题——哈希表的理解

本文深入解析哈希表数据结构,包括其工作原理、冲突处理方法及应用实例。通过LeetCode经典题目“两数之和”,演示如何运用哈希表提高算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值