677.键值映射
https://leetcode-cn.com/problems/map-sum-pairs
题目描述
方法 1:HashMap
复杂度分析
时间
空间
insert
$O(1)$ (不考虑哈希冲突的话)
$O(n)$
sum
$O(n*len(prefix))$
$O(n)$
备注
n 是 hashmap 的 key 总数,prefix 是要查找的前缀
n 是字符串数量
代码
Python Code
方法 2:Trie + DFS
思路
构建前缀树。
sum操作的时候,先判断prefix是否存在前缀树中,然后找到prefix最后的节点,开始 DFS。
DFS
大问题:
dfs(node)应该要返回以这个节点开始的所有路径中的value的和。小问题:
dfs(node.child),先找到以node的子节点开始的所有路径中的value的和。不过由于node有很多子节点,所以我们需要一个循环。大问题与小问题的关系:当我们求出了全部
dfs(node.child),那么dfs(node) = node.value + dfs(node.child1) + dfs(node.child2) + ...
递归出口:如果节点不存在,我们直接返回 0,停止递归。
复杂度分析
时间复杂度:
insert操作的时间复杂度是 $O(len(key))$,sum操作的时间复杂度是 $O(m^{n})$,m 是字符集中字符数量,n 是字符串长度。空间复杂度:$O(m^{n})$,m 是字符集中字符数量,n 是字符串长度。
时间
空间
insert
$O(len(key))$
$O(m^{n})$
sum
$O(m^{n})$
$O(m^{n})$
备注
m 是字符集中字符数量,n 是字符串长度
代码
TypeScript Code
方法 3:Trie + 时间优化
思路
在每个节点上存 prefixSum,可以把 sum 操作的时间复杂度降到 $O(1)$,代价是在 insert 的时候需要先检查 key 是否已经存在,存在的话要先从 prefixSum 中减去旧的 value,再加上新的 value。
复杂度分析
时间
空间
insert
$O(len(key))$
$O(m^{n})$
sum
$O(1)$
$O(m^{n})$
备注
m 是字符集中字符数量,n 是字符串长度
代码
方法 4:Trie + HashMap
思路
在方法 3 的基础上再加一个 hashmap,把以某个前缀开始的 key 和相应的 value存起来,比如,
我们先插入了一个
(dark, 3),然后再插入一个(darkest, 2)这时的 hashmap 应该是这样:
{ dark: 3, darkest: 2 }
这时如果我们再次插入
(darkest, 5),覆盖了之前的值,那 hashmap 就变成了:{ dark: 3, darkest: 5 }
复杂度分析
时间
空间
insert
$O(len(key))$
$O(m^{n})$
sum
$O(len(prefix))$
$O(m^{n})$
备注
m 是字符集中字符数量,n 是字符串长度
代码
Last updated
Was this helpful?