C++算法:全 O(1) 的数据结构

题目

请你设计一个用于存储字符串计数的数据结构,并能够返回计数最小和最大的字符串。
实现 AllOne 类:
AllOne() 初始化数据结构的对象。
inc(String key) 字符串 key 的计数增加 1 。如果数据结构中尚不存在 key ,那么插入计数为 1 的 key 。
dec(String key) 字符串 key 的计数减少 1 。如果 key 的计数在减少后为 0 ,那么需要将这个 key 从数据结构中删除。测试用例保证:在减少计数前,key 存在于数据结构中。
getMaxKey() 返回任意一个计数最大的字符串。如果没有元素存在,返回一个空字符串 “” 。
getMinKey() 返回任意一个计数最小的字符串。如果没有元素存在,返回一个空字符串 “” 。
注意:每个函数都应当满足 O(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 <= key.length <= 10
key 由小写英文字母组成
测试用例保证:在每次调用 dec 时,数据结构中总存在 key
最多调用 inc、dec、getMaxKey 和 getMinKey 方法 5 * 104 次

2023年5月版

class AllOne {
public:
AllOne() {
}
void inc(string key) {
int iPreNum = m_mStrNums[key];
m_mStrNums[key]++;
if (iPreNum > 0)
{
auto it = m_mNumStrs[iPreNum].find(key);
m_mNumStrs[iPreNum].erase(it);
if (m_mNumStrs[iPreNum].empty())
{
m_mNumStrs.erase(iPreNum);
}
}
m_mNumStrs[iPreNum + 1].emplace(key);
}
void dec(string key) {
int iPreNum = m_mStrNums[key];
m_mStrNums[key]–;
auto it = m_mNumStrs[iPreNum].find(key);
m_mNumStrs[iPreNum].erase(it);
if (m_mNumStrs[iPreNum].empty())
{
m_mNumStrs.erase(iPreNum);
}
if (iPreNum > 1)
{
m_mNumStrs[iPreNum - 1].emplace(key);
}
}
string getMaxKey() {
if (m_mNumStrs.empty())
{
return “”;
}
return *m_mNumStrs.rbegin()->second.begin();
}
string getMinKey() {
if (m_mNumStrs.empty())
{
return “”;
}
return *m_mNumStrs.begin()->second.begin();
}
std::unordered_map<string, int> m_mStrNums;
std::map<int ,std::unordered_multiset> m_mNumStrs;
};

2023年8月版

class AllOne {
public:
AllOne() {
}
void inc(string key) {
if (m_mStrNum.count(key))
{
auto it = m_mStrNum[key];
const int iNewNum = it->first + 1;
auto ij = it;
++ij;
it->second.erase(key);
if (0 == it->second.size())
{
m_list.erase(it);
}
bool bNeedAdd = true;
if (m_list.end() != ij )
{
bNeedAdd = iNewNum != ij->first;
}
if (bNeedAdd)
{
ij = m_list.emplace(ij, iNewNum, std::set{key});
}
else
{
ij->second.emplace(key);
}
m_mStrNum[key] = ij;
}
else
{
bool bNeedAdd = true;
auto it = m_list.begin();
if (it != m_list.end())
{
bNeedAdd = 1 != it->first;
}
if (bNeedAdd)
{
it = m_list.emplace(m_list.begin(), 1, std::set{key});
}
else
{
it->second.emplace(key);
}
m_mStrNum[key] = m_list.begin();
}
}
void dec(string key) {
auto it = m_mStrNum[key];
const int iNewNum = it->first - 1;
if (m_list.begin() != it)
{
auto ij = it;
–ij;
if (ij->first == iNewNum)
{
it->second.erase(key);
if (0 == it->second.size())
{
m_list.erase(it);
}
ij->second.emplace(key);
if (0 == iNewNum)
{
m_mStrNum.erase(key);
}
else
{
m_mStrNum[key] = ij;
}
return;
}
}
if (0 == iNewNum)
{
m_mStrNum.erase(key);
}
else
{
it = m_list.emplace(it, iNewNum, set{key});
m_mStrNum[key] = it;
++it;
}
it->second.erase(key);
if (0 == it->second.size())
{
it = m_list.erase(it);
}
}
string getMaxKey() {
if (m_list.rbegin() == m_list.rend())
{
return “”;
}
return *m_list.rbegin()->second.begin();
}
string getMinKey() {
if (m_list.begin() == m_list.end())
{
return “”;
}
return *m_list.begin()->second.begin();
}
typedef std::list < std::pair<int, std::set>> LIST;
std::unordered_map<string, LIST::iterator> m_mStrNum;
LIST m_list;
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《闻缺陷则喜算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

洒家想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
墨家名称的来源:有所得以墨记之。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境:

VS2022 C++17

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/177264.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL note2:DIsks and Files

目录 1、内存和磁盘 2、磁盘API 3、磁盘结构 4、访问磁盘页面 5、磁盘 vs SSD 5、磁盘空间管理 6、Files, Pages, Records 7、选择文件类型 8、堆文件 1&#xff09;链表实现 2&#xff09;页面目录实现 9、排序文件 10、关于计算标题页的注意事项 11、记录类型 …

Ubuntu18.04.6安装qt5.7.1(超级详细教程)

目录 1、下载对应Linux版本的qt 2、安装完qt&#xff0c;可能也要安装下对应的编译工具 1、下载对应Linux版本的qt &#xff08;1&#xff09;准备安装的是qt5.7.1&#xff1a;qt-opensource-linux-x64-5.7.1.run &#xff08;2&#xff09;在虚拟机进入存放qt安装包的目录…

cesium如何实现区域下钻

首先&#xff0c;这里讲一下数据源&#xff0c;数据源是拷贝的DataV.GroAtlas里的数据&#xff0c;这里整合了一下之前发的区域高亮的代码来实现的&#xff0c;单击左键使得区域高亮&#xff0c;每次点击都移除上一次点击的模块&#xff0c;双击左键&#xff0c;实现区域下钻并…

多级缓存之缓存同步

缓存数据同步的常见方式有三种&#xff1a; 设置有效期&#xff1a;给缓存设置有效期&#xff0c;到期后自动删除。再次查询时更新 优势&#xff1a;简单、方便缺点&#xff1a;时效性差&#xff0c;缓存过期之前可能不一致场景&#xff1a;更新频率较低&#xff0c;时效性要…

数据库timestamp遇到的小问题

在执行一个简单的更新语句时&#xff0c;当前修改的那一条数据的创建时间create_time会随着更新而变化 update read_feedback SET READ_STATUS ?, READ_ORG_NO ?, READ_ORG ?, READ_USER_NO ?, READ_USER ?, READ_TIME ? where ID ? 打了断点排查也没看到对cr…

让AI拥有人类的价值观,和让AI拥有人类智能同样重要

编者按&#xff1a;2023年是微软亚洲研究院建院25周年。25年来&#xff0c;微软亚洲研究院探索并实践了一种独特且有效的企业研究院的新模式&#xff0c;并以此为基础产出了诸多对微软公司和全球社会都有积极影响的创新成果。一直以来&#xff0c;微软亚洲研究院致力于创造具有…

推荐系统笔记--Swing模型的原理

1--Swing模型的引入 在 Item CF 召回中&#xff0c;物品的相似度是基于其受众的交集来衡量的&#xff0c;但当受众的交集局限在一个小圈子时&#xff0c;就会误将两个不相似的物品定义为相似&#xff1b; Swing 模型引入用户的重合度来判断两个用户是否属于一个小圈子&#xff…

基于检索增强生成的LLM应用开发实战【】

大型语言模型&#xff08;LLM&#xff09;无疑改变了我们与信息交互的方式。 然而&#xff0c;对于我们可以向他们提出的要求&#xff0c;它们也有相当多的限制。 LLM&#xff08;例如 Llama-2-70b、gpt-4 等&#xff09;仅了解他们接受过训练的信息&#xff0c;当我们要求他们…

C语言求数组中出现次数最多的元素

一、前言 遇到一个需求&#xff0c;需要求数组中出现次数最多的元素&#xff0c;查找了一些资料&#xff0c;结合自己的思路&#xff0c;编写了程序并验证。 只考虑元素为非负整数的数组&#xff0c;如果有出现次数相同的元素&#xff0c;则返回较小元素。 二、编程思路 以数…

使用order by 排序后的是10 6 7 8 9 而不是 6 7 8 9 10?

问题 sql order by 排序后的为什么 是10 6 7 8 9 而不是 6 7 8 9 10? 思路 在 SQL 中&#xff0c;ORDER BY 默认的排序方式是升序&#xff08;从小到大&#xff09;。所以&#xff0c;如果您简单地使用 ORDER BY 对某个列进行排序&#xff0c;它会将数字按照升序排列&#…

亚马逊鲲鹏系统可全自动化批量操作亚马逊买家号

亚马逊鲲鹏系统可以注册买家号、智能养号、自动下单、自动留评、QA等&#xff0c;是一款从注册到下单于一体的软件。 如果想要自动化注册&#xff0c;那么准备好账号所需要的邮箱、ip、手机号之后就可以进行自动注册了&#xff0c;注册时可以自动输入账号密码信息、自动接收验证…

zabbix的服务器端 server端安装部署

zabbix的服务器端 server 主机iplocalhost&#xff08;centos 7&#xff09;192.168.10.128 zabbix官网部署教程 但是不全&#xff0c;建议搭配这篇文章一起看 zabbixAgent部署 安装mysql 所有配置信息和Zabbix收集到的数据都被存储在数据库中。 下载对应的yum源 yum ins…