实现一个数据结构支持以下操作:

  1. Inc(key) - 插入一个新的值为 1 的 key。或者使一个存在的 key 增加一,保证 key 不为空字符串。
  2. Dec(key) - 如果这个 key 的值是 1,那么把他从数据结构中移除掉。否者使一个存在的 key 值减一。如果这个 key 不存在,这个函数不做任何事情。key 保证不为空字符串。
  3. GetMaxKey() - 返回 key 中值最大的任意一个。如果没有元素存在,返回一个空字符串""
  4. 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)的数据结构相关推荐

  1. LeetCode 432. 全 O(1) 的数据结构(设计题)*

    文章目录 1. 题目 2. 解题 1. 题目 请你实现一个数据结构支持以下操作: Inc(key) - 插入一个新的值为 1 的 key. 或者使一个存在的 key 增加一,保证 key 不为空字符串 ...

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

    题目 请你设计一个用于存储字符串计数的数据结构,并能够返回计数最小和最大的字符串. 实现 AllOne 类: AllOne() 初始化数据结构的对象. inc(String key) 字符串 key ...

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

    432_全O(1)的数据结构 432. 全 O(1) 的数据结构 请你设计一个用于存储字符串计数的数据结构,并能够返回计数最小和最大的字符串. 实现 AllOne 类: AllOne() 初始化数据结 ...

  4. 2022-6-13 全O(1)的数据结构,两数相加,无重复字符的最长子串,寻找两个正序数组的中位数,盛最多水的容器,......

    1. 全 O(1) 的数据结构 Design a data structure to store the strings' count with the ability to return the s ...

  5. 【超全汇总】学习数据结构与算法,计算机基础知识,看这篇就够了【ZT帅地】2020-3-7

    https://blog.csdn.net/m0_37907797/article/details/104029002 由于文章有点多,并且发的文章也不是一个系列一个系列发的,不过我的文章大部分都是围 ...

  6. 【数据结构】全 O(1) 的数据结构

    问题描述 实现一个数据结构支持以下操作: Inc(key) - 插入一个新的值为 1 的 key.或者使一个存在的 key 增加一,保证 key 不为空字符串. Dec(key) - 如果这个 key ...

  7. 全网最全原理讲解!数据结构与算法java版第五版叶核亚答案

    开头 对于一个Java程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一.因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统.内存.CPU.编程语言等多方面的基础能力,更为考验一 ...

  8. C#LeetCode刷题-设计

    设计篇 # 题名 刷题 通过率 难度 146 LRU缓存机制 33.1% 困难 155 最小栈 C#LeetCode刷题之#155-最小栈(Min Stack) 44.9% 简单 173 二叉搜索树迭 ...

  9. leetcode零散题汇总

    零散题 golang力扣leetcode 15.三数之和 golang力扣leetcode 128. 最长连续序列 golang力扣leetcode 1345.跳跃游戏IV golang力扣leetc ...

  10. leetcode刷题目录总结

    题目 题目 技巧 相似的题目 其他 1. 无序数组中找出目标为target的两个数 先定义下一个数,然后找两位的数是否存在 高频, 大厂刷题班, 第27节 2.逆序链表两数相加 链表.各位加法 高频, ...

最新文章

  1. 阿里云+wordpress搭建个人博客网站【小白专用的图文教程】
  2. [HTML]增加input标签的multiple属性上传的文件数
  3. MSSQL返回季度开始月和某月是第几季度
  4. android toolchain maintain team
  5. 设置WordPress文章关键词自动获取,文章所属分类名称,描述自动获取文章内容,给文章的图片自动加上AlT标签...
  6. SVN查看提交日志的命令
  7. 韩顺平 mysql sqlhelper类_(最全)韩顺平jsp购物车源代码(包含数据库)
  8. linux中timer的作用,linux - linux / timer.h setup_timer()到期功能不起作用? - 堆栈内存溢出...
  9. 0基础怎么做可视化大屏?2种可以节省95%时间的方法教给你
  10. D3.js中国地图下钻
  11. Android逆向系列之ARM语法篇
  12. 微信红包发送关键代码
  13. 混合储能系统能量管理simulink仿真模型。 蓄电池和超级电容构成的混合储能系统能量管理控制策略
  14. 我要考华为认证,需不需要培训呢?
  15. USB大容量存储设备禁用后恢复不了问题解决方案
  16. poi导出excel时设置单元格为数字类型(解决:导出Excel时为文本类型选中一整列不能求和问题)
  17. 前段UI框架 layui 和 amazeui 的对比
  18. 计算机启动时蓝屏后自动重起,升级Win10系统之后一开机就蓝屏且电脑不断重启怎么解决?...
  19. Boardcast03
  20. 电脑怎么还原系统win11

热门文章

  1. 【转】解决Navicat 报错:1130-host ... is not allowed to connect to this MySql server,MySQL不允许从远程访问的方法 .
  2. Web前端-HTTP Cache-control
  3. 常用排序算法:桶排序
  4. 利用express启一个server服务
  5. CentOS安装并设置MariaDB
  6. 《Windows Server 2012 Hyper-V虚拟化管理实践》——2.3 Hyper-V角色安装后的状态
  7. 【ANDROID游戏开发二十六】追加简述SURFACEVIEW 与 GLSURFACEVIEW效率!
  8. linux磁盘及文件系统管理
  9. 网络安全系列之四十九 IIS6.0权限设置
  10. SpringMVC+Spring Data JPA实现增删改查操作