leetcode小白笔记03|哈希表(217、389、496)、集合(705)

本文介绍了哈希表的基本概念,包括哈希函数和哈希碰撞的解决方法,详细阐述了哈希表的四种操作(访问、搜索、插入、删除)及其时间复杂度。同时,提到了在LeetCode中的相关练习题。接着,讨论了集合,特别是Hashset的特点、作用以及操作,包括创建、添加、查询和删除元素。文章还提供了设计哈希集合的LeetCode问题示例。
摘要由CSDN通过智能技术生成

目录

一、哈希表

(一)基本概念

(二)哈希表的四种操作

(三)哈希表的常用操作

(四)leetcode练习题

二、集合

(一)基本概念

(二)集合的四种操作(针对Hashset)

(三)集合的常用操作

(四)leetcode练习题


一、哈希表

(一)基本概念

散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做哈希函数,存放记录的数组称做哈希表

哈希碰撞:

1、概念2个不同的key通过同一个哈希函数得到相同的内存地址。

2、解决方法:链表

(4和1计算出了同一个内存地址,那么就找到第一个内存地址对比一下key,如果对应不上就顺着指针对比下一个,直到对应上了就输出)

(二)哈希表的四种操作

1、访问 Access   ×     (没有下标的概念)

2、搜索 Search  O(1)  或 O(k)(k指碰撞元素的个数) 搜索key

3、插入 Insert    O(1)  (哈希函数直接通过key找到内存地址了)

4、删除 Delete   O(1)  (同上)

(三)哈希表的常用操作

1、创建哈希表

方法1:用数组创建哈希表,让索引当作哈希表的key。

方法2:用语言自带的包创建哈希表。

下图是用数组创建,和 用字典创建。

2、添加元素

两种情况:数组、字典

3、修改元素

两种情况:数组、字典

4、删除元素

两种情况:数组(因为一开始是给数组分配了固定的长度,所以删除不方便,不如把改成不会用到的值)、字典(①pop函数,传进去key;②del函数,传进去key)

5、获取key对应的值

两种情况:数组、字典

6、检查key是否存在

两种情况:数组(只能从头到尾遍历)、字典(key in 字典,返回bool值)

7、哈希表长度、哈希表是否还有长度

下面代码只针对字典,因为数组一开始固定长度了。

 

(四)leetcode练习题

217存在重复元素 

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        # l = len(nums)
        # for i,val1 in enumerate(nums):
        #     flag = -1
        #     for j,val2 in enumerate(nums):
        #         if flag==1:
        #             break
        #         else:
        #             if val2==val1:
        #                 flag+=1
        #             else:pass
        #     if flag==1:
        #         break
        # res = True if flag>0 else False
        # return res 
        # 上面的代码自己写的,运行出了,但是时间复杂度太高了
        # 下面是学习大佬的
        if len(set(nums)) != len(nums):
        # 把list转成集合set,利用集合的自动去重功能。简单快速。缺点是:使用set方法无法保证去重后的顺序。
            return True
        else:
            return False
哈希表法

389找不同

给定两个字符串 s 和 t ,它们只包含小写字母。

字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

请找出在 t 中被添加的字母。

class Solution:
    def findTheDifference(self, s: str, t: str) -> str:
        mapping = {}
        for char in t:
            if char not in mapping:
                mapping[char] = 1
            else:
                mapping[char]+=1
        for val in s:
            if val in mapping:
                mapping[val]-=1
        # print(mapping)
        for m in mapping:
            if mapping.get(m)==1:
                return m

二、集合

(一)基本概念

1、特点:

无序(插入后也没数顺序),不重复。

eg:把1,2,3,3,2按顺序插入集合,不可能是{1,2,3,3,2},而有可能是{1,2,3}或{2,3,1}或{3,2,1}

2、集合的作用

①检查某个元素是否存在;②检查是否有重复元素。

3、set的种类

Hashset(常用)、Linklistset、Treeset(偶尔)……

4、Hashset的运作原理

(二)集合的四种操作(针对Hashset)

1、访问 Access   ×  

2、搜索 Search  O(1)  (无哈希冲突)或 O(k)(有哈希冲突,k指冲突元素的个数) 

3、插入 Insert    O(1)  (无哈希冲突)或 O(k)(有哈希冲突,k指冲突元素的个数) 

4、删除 Delete   O(1)  (无哈希冲突)或 O(k)(有哈希冲突,k指冲突元素的个数) 

(三)集合的常用操作

1、创建集合

2、添加元素

 3、查询元素

4、删除元素

5、集合的长度

(四)leetcode练习题

705设计哈希集合 

class MyHashSet:

    def __init__(self):
        self.HashSet=[0]*1000001


    def add(self, key: int) -> None:
        self.HashSet[key] = 1


    def remove(self, key: int) -> None:
        self.HashSet[key] = 0


    def contains(self, key: int) -> bool:
        if self.HashSet[key] == 1:
            return True
        else:
            return False

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值