432.全O(1)的数据结构
实现一个数据结构支持以下操作:
- Inc(key) - 插入一个新的值为 1 的 key。或者使一个存在的 key 增加一,保证 key 不为空字符串。
- Dec(key) - 如果这个 key 的值是 1,那么把他从数据结构中移除掉。否者使一个存在的 key 值减一。如果这个 key 不存在,这个函数不做任何事情。key 保证不为空字符串。
- GetMaxKey() - 返回 key 中值最大的任意一个。如果没有元素存在,返回一个空字符串
""
。 - GetMinKey() - 返回 key 中值最小的任意一个。如果没有元素存在,返回一个空字符串
""
。
挑战:以 O(1) 的时间复杂度实现所有操作。
class AllOne {
public:
/** Initialize your data structure here. */
AllOne() {
}
/** Inserts a new key <Key> with value 1. Or increments an existing key by 1. */
void inc(string key) {
if (!m.count(key)) {
if (buckets.empty() || buckets.back().val != 1) {
auto newBucket = buckets.insert(buckets.end(), {1, {key}});
m[key] = newBucket;
} else {
auto newBucket = --buckets.end();
newBucket->keys.insert(key);
m[key] = newBucket;
}
} else {
auto curBucket = m[key], lastBucket = (--m[key]);
if (lastBucket == buckets.end() || lastBucket->val != curBucket->val + 1) {
auto newBucket = buckets.insert(curBucket, {curBucket->val + 1, {key}});
m[key] = newBucket;
} else {
lastBucket->keys.insert(key);
m[key] = lastBucket;
}
curBucket->keys.erase(key);
if (curBucket->keys.empty()) buckets.erase(curBucket);
}
}
/** Decrements an existing key by 1. If Key's value is 1, remove it from the data structure. */
void dec(string key) {
if (!m.count(key)) return;
auto curBucket = m[key];
if (curBucket->val == 1) {
curBucket->keys.erase(key);
if (curBucket->keys.empty()) buckets.erase(curBucket);
m.erase(key);
return;
}
auto nextBucket = ++m[key];
if (nextBucket == buckets.end() || nextBucket->val != curBucket->val - 1) {
auto newBucket = buckets.insert(nextBucket, {curBucket->val - 1, {key}});
m[key] = newBucket;
} else {
nextBucket->keys.insert(key);
m[key] = nextBucket;
}
curBucket->keys.erase(key);
if (curBucket->keys.empty()) buckets.erase(curBucket);
}
/** Returns one of the keys with maximal value. */
string getMaxKey() {
return buckets.empty() ? "" : *(buckets.begin()->keys.begin());
}
/** Returns one of the keys with Minimal value. */
string getMinKey() {
return buckets.empty() ? "" : *(buckets.rbegin()->keys.begin());
}
private:
struct Bucket { int val; unordered_set<string> keys; };
list<Bucket> buckets;
unordered_map<string, list<Bucket>::iterator> m;
};
/**
* 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();
*/
432.全O(1)的数据结构相关推荐
- LeetCode 432. 全 O(1) 的数据结构(设计题)*
文章目录 1. 题目 2. 解题 1. 题目 请你实现一个数据结构支持以下操作: Inc(key) - 插入一个新的值为 1 的 key. 或者使一个存在的 key 增加一,保证 key 不为空字符串 ...
- 432. 全 O(1) 的数据结构
题目 请你设计一个用于存储字符串计数的数据结构,并能够返回计数最小和最大的字符串. 实现 AllOne 类: AllOne() 初始化数据结构的对象. inc(String key) 字符串 key ...
- 432_全O(1)的数据结构
432_全O(1)的数据结构 432. 全 O(1) 的数据结构 请你设计一个用于存储字符串计数的数据结构,并能够返回计数最小和最大的字符串. 实现 AllOne 类: AllOne() 初始化数据结 ...
- 2022-6-13 全O(1)的数据结构,两数相加,无重复字符的最长子串,寻找两个正序数组的中位数,盛最多水的容器,......
1. 全 O(1) 的数据结构 Design a data structure to store the strings' count with the ability to return the s ...
- 【超全汇总】学习数据结构与算法,计算机基础知识,看这篇就够了【ZT帅地】2020-3-7
https://blog.csdn.net/m0_37907797/article/details/104029002 由于文章有点多,并且发的文章也不是一个系列一个系列发的,不过我的文章大部分都是围 ...
- 【数据结构】全 O(1) 的数据结构
问题描述 实现一个数据结构支持以下操作: Inc(key) - 插入一个新的值为 1 的 key.或者使一个存在的 key 增加一,保证 key 不为空字符串. Dec(key) - 如果这个 key ...
- 全网最全原理讲解!数据结构与算法java版第五版叶核亚答案
开头 对于一个Java程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一.因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统.内存.CPU.编程语言等多方面的基础能力,更为考验一 ...
- C#LeetCode刷题-设计
设计篇 # 题名 刷题 通过率 难度 146 LRU缓存机制 33.1% 困难 155 最小栈 C#LeetCode刷题之#155-最小栈(Min Stack) 44.9% 简单 173 二叉搜索树迭 ...
- leetcode零散题汇总
零散题 golang力扣leetcode 15.三数之和 golang力扣leetcode 128. 最长连续序列 golang力扣leetcode 1345.跳跃游戏IV golang力扣leetc ...
- leetcode刷题目录总结
题目 题目 技巧 相似的题目 其他 1. 无序数组中找出目标为target的两个数 先定义下一个数,然后找两位的数是否存在 高频, 大厂刷题班, 第27节 2.逆序链表两数相加 链表.各位加法 高频, ...
最新文章
- 阿里云+wordpress搭建个人博客网站【小白专用的图文教程】
- [HTML]增加input标签的multiple属性上传的文件数
- MSSQL返回季度开始月和某月是第几季度
- android toolchain maintain team
- 设置WordPress文章关键词自动获取,文章所属分类名称,描述自动获取文章内容,给文章的图片自动加上AlT标签...
- SVN查看提交日志的命令
- 韩顺平 mysql sqlhelper类_(最全)韩顺平jsp购物车源代码(包含数据库)
- linux中timer的作用,linux - linux / timer.h setup_timer()到期功能不起作用? - 堆栈内存溢出...
- 0基础怎么做可视化大屏?2种可以节省95%时间的方法教给你
- D3.js中国地图下钻
- Android逆向系列之ARM语法篇
- 微信红包发送关键代码
- 混合储能系统能量管理simulink仿真模型。 蓄电池和超级电容构成的混合储能系统能量管理控制策略
- 我要考华为认证,需不需要培训呢?
- USB大容量存储设备禁用后恢复不了问题解决方案
- poi导出excel时设置单元格为数字类型(解决:导出Excel时为文本类型选中一整列不能求和问题)
- 前段UI框架 layui 和 amazeui 的对比
- 计算机启动时蓝屏后自动重起,升级Win10系统之后一开机就蓝屏且电脑不断重启怎么解决?...
- Boardcast03
- 电脑怎么还原系统win11
热门文章
- 【转】解决Navicat 报错:1130-host ... is not allowed to connect to this MySql server,MySQL不允许从远程访问的方法 .
- Web前端-HTTP Cache-control
- 常用排序算法:桶排序
- 利用express启一个server服务
- CentOS安装并设置MariaDB
- 《Windows Server 2012 Hyper-V虚拟化管理实践》——2.3 Hyper-V角色安装后的状态
- 【ANDROID游戏开发二十六】追加简述SURFACEVIEW 与 GLSURFACEVIEW效率!
- linux磁盘及文件系统管理
- 网络安全系列之四十九 IIS6.0权限设置
- SpringMVC+Spring Data JPA实现增删改查操作