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)相关推荐

  1. Leetcode刷题笔记:栈与队列篇

    基础知识 栈和队列的原理大家应该很熟悉了,队列是先进先出,栈是先进后出. 如图所示: 那么我这里再列出四个关于栈的问题,大家可以思考一下.以下是以C++为例,使用其他编程语言的同学也对应思考一下,自己 ...

  2. 队列实现栈 | 栈实现队列

    队列实现栈 | 栈实现队列 ⼀. ⽤栈实现队列 首先,队列的 API 如下: class MyQueue {/** 添加元素到队尾 */public void push(int x);/** 删除队头 ...

  3. 栈——栈的基本概念和基本操作

    文章目录 栈 栈的基本概念 栈的定义 栈的重要术语 栈的特点 栈的基本操作 创.销 增.删 查 判空 栈的数学性质 栈 本文我们初次学习栈,分为栈的基本概念和基本操作两个部分. 学习数据结构,我们的学 ...

  4. 顺序栈栈顶指针指向详析

    顺序栈栈顶指针指向详析 1.变长型(动态分配内存空间) #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 // 存储空 ...

  5. 判断顺序栈栈满的两种方式

    判断顺序栈栈满的两种方式

  6. LIEBE餐盘机自带微信订餐程序源代码

    成都捷德LIEBE餐盘机可提供"一人一盘"精准统计就餐人数解决方案,订餐验证自动出餐盘.餐盘机可提供一个 JSON 数据库,数据库中的每条记录都是一个 JSON 格式的对象.一个数 ...

  7. Android安卓餐盘颜色识别快餐计费解决方案源码

    Android安卓餐盘颜色识别快餐计费解决方案源码 最近了解到一个项目需要识别餐盘.在人工智能发展到的今天识别菜品确实没有问题,但是对于实际商用就会涉及到较多问题,比如:1.虽然菜品已经有成熟训练模型 ...

  8. Java #JVM(HotSpot) 运行时数据区 #程序计数器(PC寄存器)#虚拟机栈(栈帧:局部变量表、操作数栈……)#堆……

    目录 JVM中线程的说明 程序计数器(PC寄存器) 虚拟机栈 · 栈帧 ·· 局部变量表 ·· 操作数栈 ·· 动态链接 ·· 方法返回地址 ·· 本地方法栈 堆 · 查看堆的大小 · 堆的默认大小 ...

  9. 麦当劳中国再生塑料变身新餐盘;VEDETT罐装白熊玫瑰红啤酒全新上市 | 知消

    麦当劳中国联合IDEO发起设计挑战,再生塑料变身新餐盘.麦当劳中国联合创新设计公司IDEO发起开放式挑战,设计全新环保餐盘,为中国 4000 多家麦当劳门店的消费者和员工提供更好的体验,为地球贡献一份 ...

最新文章

  1. 如果不写Order By子句,会怎么样
  2. NVMe SSD是什么?
  3. 程序员面试100题之十:快速寻找满足条件的两个数
  4. 大学计算机专业全英文论文,计算机专业大学生英文简历模板
  5. ceph rgw java_ceph rgw multisite基本用法
  6. ES6(三)——Set、WeakSet、Map、WeakMap
  7. nn.Parameter的作用
  8. html捉虫游戏,街机游戏
  9. 如果看到消息“此计算机无法读取您插入的磁盘”,该怎么办?
  10. 百度地图,你必须知道的自定义Marker图标方法
  11. 实现自动发送QQ消息的简单vbs小程序
  12. 聚合物电容作用原理与基础
  13. ITMS-90096错误解决
  14. 工具类-随即获取姓名-ZH
  15. ffmpeg裁剪视频尺寸
  16. 浅谈---设计接口测试用例
  17. 别当工具人了,手摸手教会你 Jenkins !
  18. python中序列和列表区别细菌真菌病毒_生物信息中的Python 02 | 用biopython解析序列...
  19. 小程序使用小白接口上传图片方法1
  20. hazelcast-management-center安装配置

热门文章

  1. 应用层协议:HTTP与HTTPS协议详解、二者的区别
  2. 使用NVM管理Node - Windows
  3. SpringBoot开发案例之整合Spring-data-jpa
  4. Spring Boot之自定义属性
  5. SPOJ COT Count on a tree 主席树
  6. windbg 常用命令详解
  7. socket-select函数
  8. Android 亮屏速度分析
  9. VMware vSphere Client客户端安装图解教程
  10. js 弹出层的点击事件影响到底层的点击事件_聊一聊 Node.js 错误处理