432. 全 O(1) 的数据结构

2023-11-15

题目

请你设计一个用于存储字符串计数的数据结构,并能够返回计数最小和最大的字符串。

实现 AllOne 类

AllOne() 初始化数据结构的对象。
inc(String key) 字符串 key 的计数增加 1 。如果数据结构中尚不存在 key ,那么插入计数为 1 的 key 。
dec(String key) 字符串 key 的计数减少 1 。如果 key 的计数在减少后为 0 ,那么需要将这个 key 从数据结构中删除。测试用例保证:在减少计数前,key 存在于数据结构中。
getMaxKey() 返回任意一个计数最大的字符串。如果没有元素存在,返回一个空字符串 “” 。
getMinKey() 返回任意一个计数最小的字符串。如果没有元素存在,返回一个空字符串 “” 。

示例1

输入
["AllOne", "inc", "inc", "getMaxKey", "getMinKey", "inc", "getMaxKey", "getMinKey"]
[[], ["hello"], ["hello"], [], [], ["leet"], [], []]
输出
[null, null, null, "hello", "hello", null, "hello", "leet"]

解释
AllOne allOne = new AllOne();
allOne.inc("hello");
allOne.inc("hello");
allOne.getMaxKey(); // 返回 "hello"
allOne.getMinKey(); // 返回 "hello"
allOne.inc("leet");
allOne.getMaxKey(); // 返回 "hello"
allOne.getMinKey(); // 返回 "leet"

提示

  1. 1 <= key.length <= 10
  2. key 由小写英文字母组成
  3. 测试用例保证:在每次调用 dec 时,数据结构中总存在 key
  4. 最多调用 inc、dec、getMaxKey 和 getMinKey 方法 5 ∗ 1 0 4 5 * 10^4 5104

思路

很显然由于数据量比较大,所以贪心地遍历会导致时间超限。
这是对STL进行运用的题目。C++ STL的基础知识可以点击这里观看。

我的想法是同时维护两个字典(映射):

unordered_map<string, int>
这个映射存的是每一个字符串的计数值,是一个无序映射。

map<int, unordered_set >
这个是一个从整形映射到无序集合的映射。整形代表了计数值,无序集合是当前该计数值对应的所有字符串的集合。需要注意的是,在这里维护的最小的计数值是1。

有了这两个工具,当我们增加或减少一个字符串的计数值时,只需要维护两个映射即可,注意的是当一个字符串计数值为0时,要删除关于它的映射。最后,由于map是有序的,最大最小值直接返回其起始集合和终点集合中的任意值即可。

代码

class AllOne {
public:
    
    unordered_map<string, int> ma;
    map<int, unordered_set<string> > me;
    AllOne() {
        
    }
    
    void inc(string key) {
        if(ma.find(key) == ma.end())
        {
            ma[key] = 1;
            me[1].insert(key);
        }
        else 
        {
            ma[key] ++;
            me[ma[key]-1].erase(key);
            if(me[ma[key]-1].size()==0)me.erase(ma[key]-1);
            me[ma[key]].insert(key);
        }
        
    }
    
    void dec(string key) {
        ma[key] --;
        if(ma[key] == 0)
        {
            ma.erase(key);
            me[1].erase(key);
            if(me[1].size()==0)me.erase(1);
        }
        else
        {
            me[ma[key]].insert(key);
            me[ma[key]+1].erase(key);
            if(me[ma[key]+1].size()==0)me.erase(ma[key]+1);
        }
    }
    
    string getMaxKey() {
        if(ma.size() == 0)return "";
        else 
        {
            map<int, unordered_set<string> >::reverse_iterator  iter = me.rbegin();
            //unordered_set<string> s = iter->second;
            unordered_set<string>:: iterator it = iter->second.begin();
            //it = s.begin();
            return *it;
        }
        return "";
    }
    
    string getMinKey() {
        
        if(ma.size() == 0)return "";
        else 
        {
            map<int, unordered_set<string> >::iterator  iter = me.begin();
            //unordered_set<string> s = iter->second;
            unordered_set<string>:: iterator it = iter->second.begin();
            //it = s.begin();
            return *it;
        }
        return "";
    }
};

/**
 * Your AllOne object will be instantiated and called as such:
 * AllOne* obj = new AllOne();
 * obj->inc(key);
 * obj->dec(key);
 * string param_3 = obj->getMaxKey();
 * string param_4 = obj->getMinKey();
 */
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

432. 全 O(1) 的数据结构 的相关文章

随机推荐

  • 技术解读倚天 ECS 实例 — Arm 芯片的 Python-AI 算力优化

    深度学习技术在图像识别 搜索推荐等领域得到了广泛应用 近年来各大 CPU 厂商也逐渐把 AI 算力纳入了重点发展方向 通过 Arm 芯片 Python AI 算力优化 我们将看到龙蜥社区 Arm 架构 SIG Special Interes
  • 三菱modbusRTU通讯实例_编程实例

    点击箭头处 工业之家 选择 关注公众号 台达PLC控制伺服项目接线及程序 今天主要分享的是关于台达 ASDA 伺服的相关控制案例 台达 ASDA 伺服定位演示系统 控制要求 1 由台达 PLC 和台达伺服组成一个简单的定位控制演示系统 通过
  • 2019年“华为杯”研究生数学建模比赛总结

    前言 参加数学建模比赛是学习生涯甚至是人生的一次难忘的经历 不管是比赛过程还是最终的结果 无论最终结果如何 自我学习生涯至今 在研究生期间参加一次数学建模更重要的是我对数学建模比赛的一种情怀 回想本科期间参加数学建模竞赛 从校赛到省赛 再到
  • qwt之左键控制局部放大,右键逐步还原功能

    一 完成新建工程 并配置完qwt的图形 这个后期会做一个专栏进行说明 二 拖上开始的按钮 布局如图所示 三 加上头文件 include
  • V4L2 摄像头应用编程

    目录 V4L2 简介 V4L2 摄像头应用程序 打开摄像头 查询设备的属性 能力 功能 设置帧格式 帧率 申请帧缓冲 内存映射 入队 开启视频采集 读取数据 对数据进行处理 结束视频采集 V4L2 摄像头应用编程实战 实战小项目之视频监控
  • PAT C语言入门题目-7-62 切分表达式——写个tokenizer吧 (20 分)

    7 62 切分表达式 写个tokenizer吧 20 分 先说点出题背景 这个题是为低年级同学 学C语言的同学准备的 因为 对这部分同学 这个题目编写起来略有一点复杂 如果是高年级 学过了正则表达式 Regular Expression 的
  • 银行转账项目

    package Day14 class Account String id 用户名称 double balance 用户余额 public void save double money 存钱方法 if money gt 0 balance
  • Postman设置中文

    1 下载资源 postman官网下载地址 postman汉化包 2 配置 Mac 访达 应用程序 Postman app 右键查看包内容 替换Postman app Contents Resources app windows 复制到Pos
  • vue新增删除内容排序问题解决处理

    本次答题选项的删除添加是个人最初比较头疼的地方 比如ABCD四个选项 删除c选项后 点击 新增答题类型 选项按钮 则默认创建是E选项 再或者就是ABCD四个选项位置删除任意一个后 顺序被打乱等 最后解决了 就是多写好几行代码 有点繁琐 1
  • vue 使用 scss 的坑

    vue 使用 scss 的坑 日常记录开发中遇到的坑 1 使用 npm install sass loader node sass save dev 进行安装 2 在页面中直接使用 有时候可以 有时候不行 原因 我个人觉得安装的两个插件本版
  • vscode 终端 npm 命令运行时 自动弹出如何打开这个文件?

    解决
  • wireshark数据包分析实战 读书笔记

    由头 永久链接 之前读了很多书籍 但是现在回顾的时候 很多内容仅仅是熟悉 而不是真正掌握 所以尝试一种新的方式 将读书时觉得比较重要的 或者是自己还不理解的东西记录下来 达到这本书我已经不需要再去翻 只要看笔记即可的效果 第一章 数据包分析
  • sql语句查询A表有而B表没有的数据

    SELECT A 户名FROM TABLE A A TABLE B BWHERE A 户名 B 户名 WHERE B 户名 IS NULL 还可以有其他方法 1 select distinct A ID from A where A ID
  • ps多种去水印方法与技巧-适合各种水印

    ps作为一款功能强大的图片处理软件 有着丰富的功能 ps去水印也是我们常用的一种功能 但是在我们日常使用中遇到的水印千奇百怪 不同的水印就需要使用不同的去水印方法 方法一 ps内容识别去水印 1 套索工具圈出水印 2 选择 编辑 填充 内容
  • 深度学习中的优化算法之Adam

    之前在https blog csdn net fengbingchun article details 124909910 介绍过深度学习中的优化算法Adadelta 这里介绍下深度学习的另一种优化算法Adam 论文名字为 ADAM A M
  • 在linux中怎么查看错误日志

    在linux中怎么查看错误日志 cat或者tail f命令日 志 文 件 说 明 var log message 系统启动后的信息和错误日志 是Red Hat Linux中最常用的日志之一 var log secure 与安全相关的日志信息
  • Arthur and Table 【CodeForces - 557C】【Splay】

    题目链接 有一张桌子 有n个腿 第i根腿的长度是li 现在要拿掉一些腿 使得桌子稳定 拿掉第i根腿需要di的能量 稳定的条件是 假如拿掉若干条腿之后 桌子还有k个腿 那么长度最长的腿的数目要超过一半 比如桌子有5根腿 那么至少要有三根腿是最
  • 2016年终总结与来年计划

    光阴似箭 日月如梭 眨眼间已到年底 今年感慨颇丰 获益良多 因为我认为努力了就肯定会有收获 哪怕是收获那一滴滴辛勤的汗水 我在公司任务轻松时 加了些前端群 重点推荐豪情群 在群里分享技术以及生活的点滴 同时认识了一些志同道合的朋友 有大牛建
  • C/C++: 生成不重复的一组随机数

    在程序编写过程中 很多情况下回用到随机数 然而单纯的随机数不能保证每一次的数据都不同 下面方法返回一组不重复的数据 1 方法 随机一组数据 std vector
  • 432. 全 O(1) 的数据结构

    题目 请你设计一个用于存储字符串计数的数据结构 并能够返回计数最小和最大的字符串 实现 AllOne 类 AllOne 初始化数据结构的对象 inc String key 字符串 key 的计数增加 1 如果数据结构中尚不存在 key 那么