LeetCode-677-键值映射

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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值