LeetCode 1172. 餐盘栈(栈 + set)
1. 题目
我们把无限数量 ∞ 的栈排成一行,按从左到右的次序从 0 开始编号。每个栈的的最大容量 capacity 都相同。
实现一个叫「餐盘」的类 DinnerPlates:
DinnerPlates(int capacity)
- 给出栈的最大容量 capacity。void push(int val)
- 将给出的正整数 val 推入 从左往右第一个 没有满的栈。int pop()
- 返回 从右往左第一个 非空栈顶部的值,并将其从栈中删除;如果所有的栈都是空的,请返回 -1。int popAtStack(int index)
- 返回编号 index 的栈顶部的值,并将其从栈中删除;如果编号 index 的栈是空的,请返回 -1。
示例:
输入:
["DinnerPlates","push","push","push","push","push","popAtStack","push","push",
"popAtStack","popAtStack","pop","pop","pop","pop","pop"]
[[2],[1],[2],[3],[4],[5],[0],[20],[21],[0],[2],[],[],[],[],[]]
输出:
[null,null,null,null,null,null,2,null,null,20,21,5,4,3,1,-1]解释:
DinnerPlates D = DinnerPlates(2); // 初始化,栈最大容量 capacity = 2
D.push(1);
D.push(2);
D.push(3);
D.push(4);
D.push(5); // 栈的现状为: 2 41 3 5﹈ ﹈ ﹈
D.popAtStack(0); // 返回 2。栈的现状为: 41 3 5﹈ ﹈ ﹈
D.push(20); // 栈的现状为: 20 41 3 5﹈ ﹈ ﹈
D.push(21); // 栈的现状为: 20 4 211 3 5﹈ ﹈ ﹈
D.popAtStack(0); // 返回 20。栈的现状为: 4 211 3 5﹈ ﹈ ﹈
D.popAtStack(2); // 返回 21。栈的现状为: 41 3 5﹈ ﹈ ﹈
D.pop() // 返回 5。栈的现状为: 41 3 ﹈ ﹈
D.pop() // 返回 4。栈的现状为: 1 3 ﹈ ﹈
D.pop() // 返回 3。栈的现状为: 1 ﹈
D.pop() // 返回 1。现在没有栈。
D.pop() // 返回 -1。仍然没有栈。提示:
1 <= capacity <= 20000
1 <= val <= 20000
0 <= index <= 100000
最多会对 push,pop,和 popAtStack 进行 200000 次调用。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/dinner-plate-stacks
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 暴力法,按题意进行逐个搜索,超时
class STK//自定义栈
{public:int size;int capacity;vector<int> data;STK(int cap):size(0), capacity(cap) { data.resize(cap);}bool isEmpty() const { return size == 0;}bool isFull() const { return capacity == size;}void push(int val){if(!isFull())data[size++] = val;}int pop(){if(isEmpty())return -1;return data[--size];}
};
class DinnerPlates {int cap;vector<STK> v;
public:DinnerPlates(int capacity) {cap = capacity;}void push(int val) {int i = 0;while(i < v.size() && v[i].isFull())i++;if(i < v.size())v[i].push(val);else{v.push_back(STK(cap));v[i].push(val);}}int pop() {int i = v.size()-1;while(i >= 0 && v[i].isEmpty())i--;if(i < 0)return -1;int tp = v[i].pop();return tp;}int popAtStack(int index) {if(v.empty() || index >= v.size())return -1;return v[index].pop();}
};
- 改进:增加两个set , set 有序
set<int> s1;//存储没有满的栈的id
set<int> s2;//存储不为空的栈的id
- s1 的 begin() 就是可以 push 的 id
- s2 的 end()-- 就是可以 pop 的 id,记得同时维护这两个 set
class STK//自定义栈
{public:int size;int capacity;vector<int> data;STK(int cap):size(0), capacity(cap) { data.resize(cap);}bool isEmpty() const { return size == 0;}bool isFull() const { return capacity == size;}void push(int val){if(!isFull())data[size++] = val;}int pop(){if(isEmpty())return -1;return data[--size];}
};
class DinnerPlates {int cap;vector<STK> v;set<int> s1;//存储没有满的栈的idset<int> s2;//存储不为空的栈的idint tp;
public:DinnerPlates(int capacity) {cap = capacity;}void push(int val) {if(!s1.empty()){v[*s1.begin()].push(val);s2.insert(*s1.begin());if(v[*s1.begin()].isFull())s1.erase(s1.begin());}else//所有的栈都满了{v.push_back(STK(cap));v[v.size()-1].push(val);s2.insert(v.size()-1);if(cap != 1)s1.insert(v.size()-1);}}int pop() {if(s2.empty())//栈全部为空return -1;tp = v[*(--s2.end())].pop();s1.insert(*(--s2.end()));if(v[*(--s2.end())].isEmpty())s2.erase(*(--s2.end()));return tp;}int popAtStack(int index) {if(v.empty() || index >= v.size())return -1;tp = v[index].pop();if(v[index].isEmpty())s2.erase(index);s1.insert(index);return tp;}
};
LeetCode 1172. 餐盘栈(栈 + set)相关推荐
- Leetcode刷题笔记:栈与队列篇
基础知识 栈和队列的原理大家应该很熟悉了,队列是先进先出,栈是先进后出. 如图所示: 那么我这里再列出四个关于栈的问题,大家可以思考一下.以下是以C++为例,使用其他编程语言的同学也对应思考一下,自己 ...
- 队列实现栈 | 栈实现队列
队列实现栈 | 栈实现队列 ⼀. ⽤栈实现队列 首先,队列的 API 如下: class MyQueue {/** 添加元素到队尾 */public void push(int x);/** 删除队头 ...
- 栈——栈的基本概念和基本操作
文章目录 栈 栈的基本概念 栈的定义 栈的重要术语 栈的特点 栈的基本操作 创.销 增.删 查 判空 栈的数学性质 栈 本文我们初次学习栈,分为栈的基本概念和基本操作两个部分. 学习数据结构,我们的学 ...
- 顺序栈栈顶指针指向详析
顺序栈栈顶指针指向详析 1.变长型(动态分配内存空间) #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 // 存储空 ...
- 判断顺序栈栈满的两种方式
判断顺序栈栈满的两种方式
- LIEBE餐盘机自带微信订餐程序源代码
成都捷德LIEBE餐盘机可提供"一人一盘"精准统计就餐人数解决方案,订餐验证自动出餐盘.餐盘机可提供一个 JSON 数据库,数据库中的每条记录都是一个 JSON 格式的对象.一个数 ...
- Android安卓餐盘颜色识别快餐计费解决方案源码
Android安卓餐盘颜色识别快餐计费解决方案源码 最近了解到一个项目需要识别餐盘.在人工智能发展到的今天识别菜品确实没有问题,但是对于实际商用就会涉及到较多问题,比如:1.虽然菜品已经有成熟训练模型 ...
- Java #JVM(HotSpot) 运行时数据区 #程序计数器(PC寄存器)#虚拟机栈(栈帧:局部变量表、操作数栈……)#堆……
目录 JVM中线程的说明 程序计数器(PC寄存器) 虚拟机栈 · 栈帧 ·· 局部变量表 ·· 操作数栈 ·· 动态链接 ·· 方法返回地址 ·· 本地方法栈 堆 · 查看堆的大小 · 堆的默认大小 ...
- 麦当劳中国再生塑料变身新餐盘;VEDETT罐装白熊玫瑰红啤酒全新上市 | 知消
麦当劳中国联合IDEO发起设计挑战,再生塑料变身新餐盘.麦当劳中国联合创新设计公司IDEO发起开放式挑战,设计全新环保餐盘,为中国 4000 多家麦当劳门店的消费者和员工提供更好的体验,为地球贡献一份 ...
最新文章
- 如果不写Order By子句,会怎么样
- NVMe SSD是什么?
- 程序员面试100题之十:快速寻找满足条件的两个数
- 大学计算机专业全英文论文,计算机专业大学生英文简历模板
- ceph rgw java_ceph rgw multisite基本用法
- ES6(三)——Set、WeakSet、Map、WeakMap
- nn.Parameter的作用
- html捉虫游戏,街机游戏
- 如果看到消息“此计算机无法读取您插入的磁盘”,该怎么办?
- 百度地图,你必须知道的自定义Marker图标方法
- 实现自动发送QQ消息的简单vbs小程序
- 聚合物电容作用原理与基础
- ITMS-90096错误解决
- 工具类-随即获取姓名-ZH
- ffmpeg裁剪视频尺寸
- 浅谈---设计接口测试用例
- 别当工具人了,手摸手教会你 Jenkins !
- python中序列和列表区别细菌真菌病毒_生物信息中的Python 02 | 用biopython解析序列...
- 小程序使用小白接口上传图片方法1
- hazelcast-management-center安装配置