677. 键值映射
-
题目
实现一个 MapSum 类,支持两个方法,insert 和 sum:
MapSum() 初始化 MapSum 对象
void insert(String key, int val) 插入 key-val 键值对,字符串表示键 key ,整数表示值 val 。如果键 key 已经存在,那么原来的键值对将被替代成新的键值对。
int sum(string prefix) 返回所有以该前缀 prefix 开头的键 key 的值的总和。
示例 1:
输入:
[“MapSum”, “insert”, “sum”, “insert”, “sum”]
[[], [“apple”, 3], [“ap”], [“app”, 2], [“ap”]]
输出:
[null, null, 3, null, 5]解释:
MapSum mapSum = new MapSum();
mapSum.insert(“apple”, 3);
mapSum.sum(“ap”); // return 3 (apple = 3)
mapSum.insert(“app”, 2);
mapSum.sum(“ap”); // return 5 (apple + app = 3 + 2 = 5)
-
难度:中等
-
分类:多看
-
题解
-
方法一:暴力遍历
用HashMap储存所有的字符串,然后重复的则覆盖。然后需要求和的时候,遍历keyset,找到对应前缀字符串,求和输出。
代码如下:
class MapSum { HashMap<String,Integer> map; public MapSum() { map=new HashMap<>(); } public void insert(String key, int val) { map.put(key,val); } public int sum(String prefix) { int count=0; for(String temp:map.keySet()){ if(temp.startsWith(prefix)){ count+=map.get(temp); } } return count; } }
insert的时间复杂度为:O(1)
sum的时间复杂度为:O(NM),N为插入的key数目,M为prefix的长度。
空间复杂度:o(NM)
-
方法二:HashMap前缀
在第一个的基础上,我们再用一个哈希图来储存对应需要插入字符串key的所有前缀和和对应的val值。我们输出也是直接通过查找这个哈希图。
这里我们用delta来储存需要修改的val值。
当这个key不存在的时候,意味着我们需要将它所对应的所有前缀字符增加val。
当时当这个key存在,我们只需要讲它对应的所有前缀增加现在val减去之前val的数。
这就意味着delta=现在val-之前val。
这个也会用到方法三中。
class MapSum { HashMap<String,Integer> hashMap; HashMap<String,Integer> prefixs; public MapSum() { hashMap=new HashMap<>(); prefixs=new HashMap<>(); } public void insert(String key, int val) { int delta=val-hashMap.getOrDefault(key,0); hashMap.put(key,val); for(int i=1;i<=key.length();i++){ String temp=key.substring(0,i); prefixs.put(temp,prefixs.getOrDefault(temp,0)+delta); } } public int sum(String prefix) { return prefixs.getOrDefault(prefix,0); }
insert的时间复杂度为:O(N*N)
sum的时间复杂度为:O(1),N为插入的key数目,M为prefix的长度。
空间复杂度:o(NM)
-
方法三:字典树
在方法二的基础上,直接用字典树来储存,每次insert数据,需要讲它对应的前缀都更新一下。
class MapSum { class TrieNode{ int val=0; TrieNode[]next=new TrieNode[26]; } TrieNode root; HashMap<String,Integer> hashMap; public MapSum() { root=new TrieNode(); hashMap=new HashMap<>(); } //前缀树 public void insert(String key, int val) { int delta=val-hashMap.getOrDefault(key,0); hashMap.put(key,val); TrieNode preNode=root; for(char temp:key.toLowerCase().toCharArray()){ if(preNode.next[temp-'a']==null){ preNode.next[temp-'a']=new TrieNode(); preNode=preNode.next[temp-'a']; preNode.val=delta; } else{ preNode=preNode.next[temp-'a']; preNode.val+=delta; } } }
insert的时间复杂度为:O(N)
sum的时间复杂度为:O(N)
空间复杂度:o(CNM),N为插入的key数目,M为prefix的长度,C为常数
-
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/map-sum-pairs/solution/jian-zhi-ying-she-by-leetcode-solution-j4xy/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。