重新开始刷题的第1天。
今天的题目是677. Map Sum Pairs。
一道前缀树相关的题目。
一开始没看到题目中的“如果键已经存在,那么原来的键值对将被替代成新的键值对”。想当然的在实现插入时,直接增加值了。然后在第二个测例就错了。
因为这里希望能够更新值,所以最简单的修改方式就是给TireNode
增加一个isLeaf
的属性来标识该节点是否是某个键的末尾,然后只有当isLeaf == true
时,节点的value
才是有意义的。这样修改的话,插入部分不需要做太多修改,但是前缀和的求解却需要递归遍历子树。
这样过是过了,但是速度贼慢,主要在于sum
这里每次都需要重新求解。因此为了优化速度,我们给TrieNode
结构增加一个sum
属性,这个属性会在insert
中维护,使其为该节点的前缀和。在维护sum
属性的方式是通过在insert
时,修改完末尾节点的value
后,计算出新的value
与旧的value
(默认为0)的差值,然后向上更新。同时,为了加快速度和减少空间,这里还将TireNode
的child
从vector
修改成unordered_map
。