哈希表在Python中可以使用字典和集合表示。
接下面我们以最热力扣100题为例子,使用哈希表来解决。
一、两数之和
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例代码如下:
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
hashtable = {}
for i, value in enumerate(nums):
if target - value in hashtable:
return [i, hashtable[target - value]]
else:
hashtable[value] = i
二、字母异位分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例代码演示如下:
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
hashtable = {}
for word in strs:
sorted_word = ''.join(sorted(word)) # sorted_word是当前排序好的字符串
if sorted_word in hashtable:
hashtable[sorted_word].append(word)
else:
hashtable[sorted_word] = [word] # 注意是添加为列表;为不是字符串
return list(hashtable.values())
三、最长连续序列
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
示例代码如下:
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
# 如果一个数字num是连续序列的队首,则num-1不在序列中
# 如果一个数字num是连续序列的队尾,则num+1不在序列中
set_nums = set(nums) # 去重
res = 0 # 最长的序列长度
seq_len = 0 # 当前的序列长度
for num in set_nums:
if (num-1) not in set_nums: # 假设当前num是队首
seq_len = 1
while (num+1) in set_nums:
seq_len += 1
num += 1
res = max(res, seq_len) # 每次循环结束后更新最长序列的长度
return res
其中第三题分析当前序列长度和最长序列长度,最后通过max更新每次后的最长序列,避免讨论当列表为空的情况,较为巧妙,有借鉴的地方。