哈希表
哈希表:存储位置=关键词
列表:存储位置=索引
1. 两数之和
题目
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
思路
step1:将值和对应下标存储在哈希表中
step2:循环nums,判断target - nums[i]有没有在哈希表中,注意判断两者下标是否一致!
代码
时间:O(n)
空间:O(n)
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
'''
思路:step1:将值和对应下标存储在哈希表中
step2:循环nums,判断target - nums[i]有没有在哈希表中,注意判断两者下标是否一致!
'''
hashmap ={}
n = len( nums)
for i in range(n):
hashmap[ nums[i]] = i
for i in range(n):
k = nums[i]
k2 = target - k
if k2 in hashmap.keys() and i!=hashmap[k2]:
return [i,hashmap[k2]]
49.字母异位词分组
题目
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
思路
step1:循环数组,alpha存储字母的单词并排序,判断alpha是否存在哈希表中,如果是,则append
**注意:**python列表不能作为哈希表的key值
代码
时间复杂度:O(nmlogm),其中 n 为 strs 的长度,m 为 strs[i] 的长度。每个字符串排序需要 O(mlogm) 的时间。我们有 n 个字符串,所以总的时间复杂度为 O(nmlogm)。
空间复杂度:O(nm),字典存储空间
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
hashmap={}
for i in strs:
alpha = ''.join(sorted(i))
if alpha not in hashmap:
hashmap[alpha]=[]
hashmap[alpha].append(i)
return list(hashmap.values())
128. 最长连续序列
题目
给定一个未排序的整数数组 nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n)
的算法解决此问题。
思路
用集合表示数组,循环集合,只需要寻找序列的初始值,找出最大序列
代码
时间:O(n)
空间:O(n)
class Solution:
def longestConsecutive(self, nums: List[int]) -> int:
nums_set = set(nums)
ans = 0
for x in nums_set:
if x-1 in nums_set:
continue
y=x+1
while y in nums_set:
y=y+1
ans = max(ans,y-x)
return ans
总结
如果题目只针对数值有要求,适合用哈希表