目录
一、哈希表
(一)基本概念
散列表(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
![](https://i-blog.csdnimg.cn/blog_migrate/c3ca69210df9d947cb437fd454269b3a.png)
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