文章目录

  • 1. 题目
  • 2. 解题

1. 题目

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

  • Inc(key) - 插入一个新的值为 1 的 key。
    或者使一个存在的 key 增加一,保证 key 不为空字符串。
  • Dec(key) - 如果这个 key 的值是 1,那么把他从数据结构中移除掉。
    否则使一个存在的 key 值减一。
    如果这个 key 不存在,这个函数不做任何事情。key 保证不为空字符串。
  • GetMaxKey() - 返回 key 中值最大的任意一个。
    如果没有元素存在,返回一个空字符串"" 。
  • GetMinKey() - 返回 key 中值最小的任意一个。
    如果没有元素存在,返回一个空字符串""。

挑战:
你能够以 O(1) 的时间复杂度实现所有操作吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/all-oone-data-structure
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

参考大佬的题解

class node
{public:int val;unordered_set<string> s;node(int v){val = v;}
};
class AllOne {unordered_map<string, list<node>::iterator> m;list<node> l;
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) {auto it = m.find(key);if(it == m.end()){if(l.empty() || l.front().val > 1)l.push_front(node(1));//没有val为1的,新建l.begin()->s.insert(key);m[key] = l.begin();}else{auto iter = it->second;//迭代器位置int num = iter->val;//当前数字iter->s.erase(key);//原位置处删除auto olditer = iter;auto newiter = ++iter;num++;if(newiter != l.end() && newiter->val == num){   //新位置数字刚好是+1以后的newiter->s.insert(key);m[key] = newiter;}else{  //新开辟节点auto temp = l.insert(newiter,node(num));//新节点之前插入temp->s.insert(key);//返回的当前节点存入字符串m[key] = temp;}if(olditer->s.empty())l.erase(olditer);//原来节点为空要删除}}/** Decrements an existing key by 1. If Key's value is 1, remove it from the data structure. */void dec(string key) {auto it = m.find(key);if(it == m.end()) return;auto iter = it->second;int num = iter->val;iter->s.erase(key);auto olditer = iter;auto newiter = --iter;num--;if(num == 0)m.erase(key);else if(olditer != l.begin() && newiter->val == num){  //前面还有节点,且数字吻合newiter->s.insert(key);m[key] = newiter;}else{ //前面数字不符合,在老节点前插入auto temp = l.insert(olditer,node(num));temp->s.insert(key);m[key] = temp;}if(olditer->s.empty())l.erase(olditer);}/** Returns one of the keys with maximal value. */string getMaxKey() {if(l.empty()) return "";return *(l.back().s.begin());}/** Returns one of the keys with Minimal value. */string getMinKey() {if(l.empty()) return "";return *(l.front().s.begin());}
};

100 ms 24.9 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

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

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

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

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

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

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

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

  4. 算法设计题3.16-栈和队列-第3章-《数据结构习题集》-严蔚敏吴伟民版

    习题集完整源码部分 第3章  栈和队列                                                                                 ...

  5. 算法设计题3.27-栈和队列-第3章-《数据结构习题集》-严蔚敏吴伟民版

    习题集完整源码部分 第3章  栈和队列                                                                                 ...

  6. 【python】一道LeetCode搞懂递归算法!#131分割回文串 #以及刷LeetCode的一点点小心得 [数据结构与算法基础]

    题目:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串.返回 s 所有可能的分割方案. # 示例 输入: "aab" 输出: [["aa",&q ...

  7. linux 网络对讲,基于ARM与Linux的全数字化可视对讲系统的设计与实现

    摘要: 在信息化飞速发展的今天智能家居系统已越来越多的被人们所接受,从楼宇可视对讲到紧急情况报警,再到远程家电控制,智能家居系统在人们的日常生活中扮演着重要的角色.传统的可视对讲系统都是基于模拟音视频 ...

  8. 《安富莱嵌入式周报》第308期:开源带软硬件安全认证的PLC设计,开源功率计,可靠PID实现,PR2机器人设计文件全开源,智能手表设计WASP-OS

    周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Pow ...

  9. 基于FPGA的大屏幕全彩LED扫描控制器设计

    关键字:FPGA 大屏幕 LED 1 引言 作为大型平板显示设备的一种,LED 显示屏以其使用寿命长.维护费用低.功耗低等特点在显示领域占有重要的位置.特别在近年,带有红.绿.蓝三基色以及灰度显示效果 ...

最新文章

  1. android 按钮放中间,Android实现button居中的方法
  2. 树和二叉树的基本概念(二级)
  3. php swoole 项目实战,Laravel 中使用 swoole 项目实战开发案例一 (建立 swoole 和前端通信)...
  4. 在WinForm中实现省市级联的效果
  5. bzoj1625[Usaco2007 Dec]宝石手镯*
  6. 让你难忘的一段情感故事是什么?
  7. Spark1.0新特性--Spark SQL
  8. VPC、快照、重置密码、重启、关机、扩容
  9. Java学习视频教程
  10. itextpdf使用
  11. android多开器工作原理,[原创]app隐藏大师绕过密码与多开分析
  12. 小米和联想的“骁龙”之争,首发第一,友谊第二...
  13. 个人收藏夹 html,用h1和段落p 写一个三毛语录
  14. java 线程安全和不安全
  15. Monorail学习笔记
  16. JavaScript对数组操作。添加/删除/截取/排序/倒序
  17. springdata数据源的配置
  18. 面向对象(Object-Oriented)
  19. MIPIDSI转EDP芯片,东芝TC358867XBG芯片说明
  20. 东北大学继续教育学院计算机辅助数控编程,计算机辅助数控编程B卷李虎.doc离线.doc...

热门文章

  1. Django之创建应用以及配置路由
  2. 【R】语言第二课----- 变量的使用方法
  3. pymysql操作mysql数据库
  4. 星星排序python_python中怎么实现星星排列
  5. qtreewidget 获取根节点_详解去中心化信任根dRoT技术
  6. linux 最强shell,最牛B 的 Linux Shell 命令(一)
  7. python查询斐波那契数列通项公式_分享一个神奇的操作系统——斐波那契+MACD,每一波都有20%以上的收益!...
  8. uboot源码——命令体系
  9. DataGridView带图标的单元格实现
  10. [LeetCode] Convert Sorted Array to Binary Search Tree