- 哈希表理论基础
- LeetCode 242.有效的字母异位词
- LeetCode 349. 两个数组的交集
- LeetCode 202. 快乐数
- LeetCode 1. 两数之和
前言
最近比较忙,作业拉下好多,要加紧补上!
哈希表理论基础
1-学前疑问
- 什么是哈希表,它的内部实现原理是什么样的?
- 为什么需要哈希表,它有什么优势?
答:可以快速判断一个元素是否出现在集合当中 - 解释一下哈希函数
答:哈希函数就是将元素映射成哈希表中索引的法则,是哈希表设计的核心环节 - 理解哈希碰撞
答:由于dataSize大于tableSize或者哈希函数设计不当,不同的元素经哈希函数映射后会得到相同的索引,有封闭寻址法和开放寻址法等消解方法。 - 常见哈希表的类型、实现方法和区别
答:三个经典的哈希表解释数组array、集合set与映射map
2-学习中
- 如何理解“数组解释哈希表”
- 如何理解哈希表是“牺牲了空间换取了时间”
- set和map分别是什么操作
3-学后总结
LeetCode 242.有效的字母异位词
242-1 原始想法
要注意,“字母异位词”指的是仅包含相同字母且每种字母的数量也相同的两个字符串。
242-2 随想录提醒
这里不需要考虑字母出现的顺序,所以可以维护size均为26的数组record1和record2,用于记录字符串中各个字母的数量,并将两个字符串的record进行比较。
242-3 最终题解
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
record = [0] * 26
for i in s:
record[ord(i) - ord('a')] += 1 # 使用字母相对a的位置计算其在record中的索引
for i in t:
record[ord(i) - ord('a')] -= 1
return True if record == [0]*26 else False
242-4 Debug过程
代码还是比较容易写的,这里主要讲下python中的内置函数ord(),它用于将单个字符转化为Unicode的形式(默认转化为十进制格式),可以参照这篇博客,另一篇博客对Unicode、ASCII和UTF-x做了详细介绍。
LeetCode 349. 两个数组的交集
349-1 原始想法
略
349-2 随想录提醒
主要就是使用数组自制哈希表(仔细看题目提示,nums元素的数值和其size都小于1000)或者直接借用现成的数据结构(python中是字典dict和集合set)
349-3 最终题解
这里主要记录使用数组自制哈希表的方法,和随想录官方答案一样,进行了多次循环。
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
arr1, arr2 = [0]*1001, [0]*1001
result = []
for i in nums1: arr1[i] += 1
for j in nums2: arr2[j] += 1
for k in range(1001):
if arr1[k]*arr2[k]>0:
result.append(k)
return result
349-4 Debug过程
无
LeetCode 202. 快乐数
202-1 原始想法
这题……看看就好,不要太当真了,图个“快乐”U•ェ•*U。
202-2 随想录提醒
随想录是这么说的,但我感觉这背后应该有数论的证明(所以对这题不用太纠结了):
题目中说了会无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!
202-3 最终题解
class Solution:
def isHappy(self, n: int) -> bool:
checkedSum = set()
if n==1: return True
else:
while n not in checkedSum:
checkedSum.add(n)
n = sum(int(i)**2 for i in str(n))
return True if n==1 else False
202-4 Debug过程
无
LeetCode 1. 两数之和
1-1 原始想法
如何表示“和”这一概念,这是该题的难点
1-2 随想录提醒
这题可以转化成这样想:对于数组nums中的任一元素i,需要寻找target-i是否存在于数组中。当然,直接这样编码就和多重循环的暴力解法无异,但可以引入哈希的思想,将每个遍历过的元素储存于哈希表中,发挥哈希表利于判断一个元素是否存在的优势,就可以解决问题,将问题时间复杂度降低为O(n)
同时要注意,本题构建哈希表时应当采用map的基本结构(对于于python的字典dict),既去重的存储数值,又要保存下标的信息。
1-3 最终题解
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
checked = dict()
for idx, n in enumerate(nums):
finder = target - n
if finder in checked:
return [idx, checked[finder]]
else:
checked[n] = idx
有小伙伴可能会问:为什么使用字典的key储存nums中的元素数值,value存储元素下标,能不能反过来?答案是可以的,但不建议。按上述方法存储,当nums中有相同数值是元素时,数值key不会改变,但这一数值的value也就是下标会得到更新;反过来,value永远的不一样,会增加字典的长度。
1-4 Debug过程
一次AC!