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 是字符串长度

代码

更多题解可以访问:https://github.com/suukii/91-days-algorithm

Last updated

Was this helpful?