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

文章目录

    • 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阿明),一起加油、一起学习进步!
Michael阿明

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

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

相关文章

vs2010 rdlc 报表及报表控件

有个winfrom项目要使用报表&#xff0c;数据来源于自定义类&#xff08;model&#xff09;&#xff0c;从网上找了好多教程&#xff0c;都是说如何拖控件&#xff0c;如何设值之类的。没有我想要的效果。 我想要的效果&#xff1a;将rdlc文件放到Debug目录下&#xff0c;以便一…

服务器如何安装应用程序,第四节 服务器端应用程序安装

1、友情提示&#xff1a;退路①备份配置文件Linux 系统环境下配置文件通常内容很多。如果不小心修改了不该修改的地方&#xff0c;自己有不记得做了修改&#xff0c;那么将来报错很难找到错误位置。为了避免这样的问题&#xff0c;我们可以在修改任何配置文件之前都多复制一份&…

设置 NSZombieEnabled 定位 EXC_BAD_ACCESS 错误

http://unmi.cc/nszombieenabled-locate-exc_bad_access-error, 来自 隔叶黄莺 Unmi Blog 我们做 iOS 程序开发时经常用遇到 EXC_BAD_ACCESS 错误导致 Crash&#xff0c;出现这种错误时一般 Xcode 不会给我们太多的信息来定位错误来源&#xff0c;只是在应用 Delegate 上留下像…

LeetCode 785. 判断二分图(染色法)

文章目录1. 题目2. 解题1. 题目 给定一个无向图graph&#xff0c;当这个图为二分图时返回true。 如果我们能将一个图的节点集合分割成两个独立的子集A和B&#xff0c;并使图中的每一条边的两个节点一个来自A集合&#xff0c;一个来自B集合&#xff0c;我们就将这个图称为二分…

css检测,CSS检测工具 CSS Lint简介

Nicholas C. Zakas最近发布了CSS Lint&#xff0c;旨在检测CSS代码中存在的各种问题&#xff0c;从而写出更高效的CSS。CSS Lint现有的一些规则&#xff1a;修复解析错误(Parsing errors should be fixed)避免使用多类选择符(Dont use adjoining classes)IE6以及更古老的浏览器…

c++之菱形继承

前天和大学室友吃烧烤&#xff0c;其中谈到菱形继承的问题&#xff0c;突然发现脑中对这个几乎空白&#xff0c;所以晚上回来就上网搜了搜&#xff0c;言归正传&#xff0c;说到菱形继承&#xff0c;就要说到虚继承的概念&#xff0c;对于虚继承&#xff0c;就是为了解决从不同…

LeetCode 1506. Find Root of N-Ary Tree(异或)

文章目录1. 题目2. 解题1. 题目 Given all the nodes of an N-ary tree as an array Node[] tree where each node has a unique value. Find and return the root of the N-ary tree. Follow up: Could you solve this problem in constant space complexity with a linea…

客户端与服务器之间的文件传输,客户端与服务器的文件传输

客户端与服务器的文件传输 内容精选换一换使用FTP上传文件时&#xff0c;写入失败&#xff0c;文件传输失败。该文档适用于Windows系统上的FTP服务。FTP服务端在NAT环境下&#xff0c;客户端需使用被动模式连接服务端。在这种情况下&#xff0c;服务端的IP地址无法从路由器外部…

LeetCode 280. 摆动排序

文章目录1. 题目2. 解题1. 题目 给你一个无序的数组 nums, 将该数字 原地 重排后使得 nums[0] < nums[1] > nums[2] < nums[3]...。 示例: 输入: nums [3,5,2,1,6,4] 输出: 一个可能的解答是 [3,5,1,6,2,4]来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链…

复制文本框内容至剪贴板

1 <body> 2 <form id"form1" runat"server"> 3 <div> 4 <textarea id"txtArea" cols"30" rows"3">我是一个文本&#xff0c;Hello World&#xff01;</textarea><br />…

js动态添加控件服务器响应,JS实现动态给标签控件添加事件的方法示例

本文实例讲述了JS实现动态给标签控件添加事件的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;/p>"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">function set() {var obj document.getElementById("fy");//obj.attach…

LeetCode 683. K 个空花盆(set/滑动窗口)

文章目录1. 题目2. 解题2.1 set 有序2.2 滑动窗口1. 题目 花园里有 N 个花盆&#xff0c;每个花盆里都有一朵花。 这 N 朵花会在 N 天内依次开放&#xff0c;每天有且仅有一朵花会开放并且会一直盛开下去。 给定一个数组 flowers 包含从 1 到 N 的数字&#xff0c;每个数字表…

(转)一步一步Asp.Net MVC系列_权限管理设计起始篇

原文地址&#xff1a;http://www.cnblogs.com/mysweet/archive/2012/07/26/2610793.html前一段时间,写了一步一步asp.net的一系列博客,最近,也快要大四,忙着准备找个工作,这也算是最后一个假期了,这个系列可能不太长,尽量写完.还是多学习,少扯淡的风格,我们的学习还好继续,现在…

无盘服务器 机械盘,Win7启动速度研究,同样的PC配置,机械盘、固态盘、无盘网络启动速度为何不同?...

别装深沉了&#xff0c;赶快来凑凑热闹吧&#xff01;您需要 登录 才可以下载或查看&#xff0c;没有帐号&#xff1f;立即注册x一、环境&#xff1a;一台台式机(映泰B85、i5-4590、16G内存、三星、Intel固态盘、Realtek网卡)&#xff1b;一台笔记本(T440P、8G内存、三星、Inte…

LeetCode 681. 最近时刻

文章目录1. 题目2. 解题1. 题目 给定一个形如 “HH:MM” 表示的时刻&#xff0c;利用当前出现过的数字构造下一个距离当前时间最近的时刻。每个出现数字都可以被无限次使用。 你可以认为给定的字符串一定是合法的。 例如&#xff0c;“01:34” 和 “12:09” 是合法的&#xf…

指针和对象

使用对象指针时&#xff0c;需要注意几点&#xff1a; 使用常规表示法来声明指向对象的指针&#xff1a; String *glamour&#xff1b; 可以将指针初始化为指向已有的对像&#xff1a; String *first&saying[0]&#xff1b; 可以使用new来初始化指针&#xff1a; String…

最右显示请求服务器不存在,修改合流任务_实时音视频 RTC_服务端API参考_合流任务管理_华为云...

响应示例状态码&#xff1a; 200修改成功{"jobs" : [ {"job_id" : "607824b4fa163e19fe301cc817dda855","job_unique_id" : "707e5bfb1ccf4eef","stream_name" : "m_607824b4fa163e19fe301cc817dda855_gigu&…

[Hands On ML] 5. 支持向量机

文章目录1. 线性支持向量机分类2. 非线性支持向量机分类2.1 多项式核2.2 高斯 RBF 核3. 支持向量机回归4. 原理本文为《机器学习实战&#xff1a;基于Scikit-Learn和TensorFlow》的读书笔记。 中文翻译参考 SVM 特别适合应用于复杂但中小规模数据集的分类问题。 可参考&#…

网络流sap需要注意的地方

int sap(){memset(level, 0, sizeof level);memset(gap, 0, sizeof gap);memset(cur, 0, sizeof cur);int u pre[s] s;int aug inf;gap[s] n;这个要使源点gap值为点个数int v;int flow 0;while(level[s] < n){for(v cur[u]; v < n; v ){if(c[u][v] > 0 &&am…

LeetCode 340. 至多包含 K 个不同字符的最长子串(滑动窗口)

文章目录1. 题目2. 解题1. 题目 给定一个字符串 s &#xff0c;找出 至多 包含 k 个不同字符的最长子串 T。 示例 1: 输入: s "eceba", k 2 输出: 3 解释: 则 T 为 "ece"&#xff0c;所以长度为 3。示例 2: 输入: s "aa", k 1 输出: 2 解释…