系列文章
python coding with ChatGPT 打卡第1天| 二分查找、移除元素
python coding with ChatGPT 打卡第2天| 双指针、滑动窗口、螺旋矩阵
python coding with ChatGPT 打卡第3天| 移除链表、设计链表、反转链表
python coding with ChatGPT 打卡第4天| 链表其他操作:两两交换、删除倒数第N个节点 链表相交 环形链表
目录
当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法
常见的三种哈希结构:
- 数组
- set(集合)
- map(映射)
要枚举的话时间复杂度是O(n),但如果使用哈希表的话, 只需要O(1)就可以做到。
但是哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。
有效的字母异位词
Key points
- 数组就是简单的哈希表,但是数组的大小可不是无限开辟的
- 需要定义一个多大的数组呢,大小为26 就可以了,初始化为0,因为字符a到字符z的ASCII也是26个连续的数值。
相关题目
视频讲解
重点分析
def isAnagram(s, t):
alpha_table =[0]*26
for char in s:
alpha_table[ord(char)-ord('a')] += 1
for char in t:
alpha_table[ord(char) - ord('a')] -= 1
print(alpha_table)
if all([x==0 for x in alpha_table]):
return True
return False
时间复杂度为O(n),空间上因为定义是的一个常量大小的辅助数组,所以空间复杂度为O(1)。
方法2:字符串排序
def isAnagram(s,t):
if sorted(s) == sorted(t):
return True
return False
两个数组的交集
Key points
- 使用数组来做哈希的题目,是因为题目都限制了数值的大小。而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。
- 遇到哈希问题数组比set的优势:使用set 不仅占用空间比数组大,而且速度要比数组慢,set把数值映射到key上都要做hash计算的。
- 本题后面力扣改了题目描述和后台测试数据,增添了数值范围:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
所以就可以 使用数组来做哈希表了, 因为数组都是 1000以内的。
相关题目
视频讲解
重点分析
def intersection(nums1, nums2):
record = [0]*1001
result = set()
for i in nums1:
record[i] = 1
for i in nums2:
if record[i] == 1:
result.add(i)
return list(result)
方法2:
def intersection(nums1, nums2):
return list(set(nums1) & set(nums2))
快乐数
相关题目
重点分析
class Solution(object):
def isHappy(self, n):
"""
:type n: int
:rtype: bool
"""
num_str = str(n)
new_num_str = num_str
seen = set()
while new_num_str not in seen:
seen.add(new_num_str)
new_num = 0
for char in new_num_str:
new_num += int(char)*int(char)
new_num_str = str(new_num)
if new_num_str == '1':
return True
else:
return False
两数之和
Key points
- 当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。
相关题目
视频讲解
重点分析
暴力解法:
def twoSum(nums, target):
for i in range(len(nums)):
for j in range(i+1, len(nums)):
if nums[i] + nums[j] == target:
return [i,j]
哈希法:
record = dict()
for i in range(len(nums)):
i_target = target - nums[i]
if i_target in record:
return [i, record[i_target]]
record[nums[i]] = i
时间复杂度: O(n)
空间复杂度: O(n)