剑指offer—day1.用两个栈实现队列、包含min函数的栈

news/2024/11/9 1:53:36/

1.用两个栈实现队列

本题来源:力扣

剑指 Offer 09. 用两个栈实现队列 - 力扣(LeetCode)icon-default.png?t=MBR7https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/题目描述 

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

示例1

输入:
["CQueue","appendTail","deleteHead","deleteHead","deleteHead"]
[  [],[3],[],[],[]  ]
输出:[null,null,3,-1,-1]

示例2

输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[  [],[],[5],[2],[],[]  ]
输出:[null,-1,null,null,5,2]

示例解读

  • CQueue为构造函数,对类进行初始化,但并不往里面加数据,[ ]代表没有返回值
  • appendTail在队尾增加元素,没有返回值[ ]
  • deleteHead删除队首元素,若队内没有元素(示例2),则返回-1,若有元素(示例1),则返回这个被删除的元素

 解题思路

由于队列先进先出的性质,要确保最后的出栈操作时,出栈顺序和入栈顺序一样,要点

  • 入栈操作不必过多关注
  • 出栈操作是重点

具体过程如下

  1. 准备两个栈(s1和s2),s1用于入数据,s2用于出数据
  2. 入数据时往s1入,不用考虑其他
  3. 出数据时,先检查s2中有没有数据,如果有则可以直接记录并出栈顶数据
  4. 如果s2中没有数据,检查s1,如果s1中也没有数据,返回-1
  5. 如果s1中有数据,则将s1中所有数据依次出栈,并依次往s2入栈,此时越晚在s1入栈的元素在s2中的位置就越接近栈底,入栈越早的越在栈顶
  6. 此时再重复步骤3

实现代码

class CQueue {
public:CQueue() {}void appendTail(int value) {  // 步骤2s1.push(value);}int deleteHead() {int ret;if(!s2.empty())   // 步骤3{ret = s2.top(); s2.pop();}// no data in s2, check s1else                         // 步骤4{if(s1.empty()){return -1;  // if s1 is empty, there is no integer push ,return -1}// If there is data in s1,the  will be exited and all will enter s2while(!s1.empty())        // 步骤5{int tmp = s1.top();s2.push(tmp);s1.pop();}ret = s2.top();          // 步骤6s2.pop();}return ret;}
private:// 步骤1stack<int> s1; // s1 is uesd to input integerstack<int> s2; // s2 is used to output integer
};/*** Your CQueue object will be instantiated and called as such:* CQueue* obj = new CQueue();* obj->appendTail(value);* int param_2 = obj->deleteHead();*/

 

2. 包含min函数的栈

题目来源:力扣

剑指 Offer 30. 包含min函数的栈 - 力扣(LeetCode)icon-default.png?t=MBR7https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/题目描述

定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)

示例

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.min();   --> 返回 -2.

解题思路

对于一个栈,pop和push操作均为O(1),因此本题所考察的是如何实现O(1)的找最小值,原生stack需要遍历,时间复杂度为O(N),因此解题的思路是使用另外一个栈来动态保存栈的最小值

我们一共使用两个栈,s1用于数据入栈,s2用于存储当前栈的最小值,有几点需要注意

  • 每次入栈时,都检查这个元素是否比s2的栈顶元素大,如果是,则说明s2的栈顶仍然保存s1中最小的那个元素,此时这个元素就只往s1入栈,不入s2。例如,s1入栈顺序为2,3,1,那么s2中入栈顺序为2,1
  • 如果s1入栈顺序为2,1,1,那么s2中需要将两个1全部入栈,因为如果只入栈一个1,那么s1pop()之后,s2也要pop(),此时s1:2,1 而s2:2,就不匹配

具体过程如下

  1. 准备两个栈(s1和s2),s1用于入数据,s2用于动态保存s1中的最小值
  2. 入栈时检查入栈元素和s2栈顶元素的大小(注意s2为空的情况)
  3. 如果栈空或者入栈元素小于等于s2栈顶元素,则s1和s2都入栈
  4. 如果入栈元素大于s2栈顶元素,则只入s1
  5. 出栈时,如果s1栈顶元素于(这里只可能大于或者等于)s2栈顶元素,则只出栈s1
  6. 如果s1栈顶元素等于s2栈顶元素,则s1和s2同时出栈
  7. s2的栈顶一直保存s1的最小值,故时间复杂度为O(1)

实现代码

class MinStack {
public:/** initialize your data structure here. */MinStack()  {}void push(int x) {                    // 步骤2// if s2 is empty or the entered value isn't greater than the top element in s2,record itif(s2.empty() || s2.top() >= x)   // 步骤3{s1.push(x);s2.push(x);}// if the entered value is greater than the top element in s2, don't push it to s2 else                               // 步骤4   {s1.push(x); }}// be careful when pop an element,compare s1.top and s2.top firstly to check if itvoid pop() {                      if(s1.top() > s2.top()) // s1.top > s2.top, just pop s1  // 步骤5{s1.pop();}else                    // pop s1 and s2 both            // 步骤6{s1.pop();s2.pop();}}int top() {return s1.top();}int min() {                             // 步骤7return s2.top();}private:                     // 步骤1stack<int> s1; // stack s1 is used store datastack<int> s2; // stack s2 is used to record the minimum element in s1
};/*** Your MinStack object will be instantiated and called as such:* MinStack* obj = new MinStack();* obj->push(x);* obj->pop();* int param_3 = obj->top();* int param_4 = obj->min();*/

http://www.ppmy.cn/news/18439.html

相关文章

【蓝桥杯】历届真题 天干地支(决赛)Java

【资源限制】 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 【问题描述】 古代中国使用天干地支来记录当前的年份。 天干一共有十个&#xff0c;分别为:甲(jia)、乙(yi)、丙(bing)、丁 (ding…

java学习资料和视频

文章目录1.分布式商城项目&#xff08;SpringCloud Vue ElementUI)2.大厂算法学习视频&#xff08;leetCode前100题目本人讲解3&#xff0c;加本人学习购买学习过的vip视频&#xff09;3.java面经&#xff08;本人面试多家企业的总结&#xff09;4.java的面试实战指导5.可以长…

数据结构进阶 unordered_set unordered_map的使用

作者&#xff1a;小萌新 专栏&#xff1a;数据结构进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍高阶数据结构 unorder_set unorder_map的使用 unorder_set unorder_mapunordered系列关联式容器unordered_set介绍unordere…

89. 注意力机制以及代码实现Nadaraya-Waston 核回归

1. 心理学 动物需要在复杂环境下有效关注值得注意的点心理学框架&#xff1a;人类根据随意线索和不随意线索选择注意点 随意&#xff1a;随着自己的意识&#xff0c;有点强调主观能动性的意味。 2. 注意力机制 2. 非参注意力池化层 3. Nadaraya-Waston 核回归 4. 参数化的注意…

OpenCV级联分类器

OpenCV级联分类器 概览 OpenCV: 一个计算机视觉库, 提供了一种称级联分类器的方法检测对象级联分类器:一种基于AdaBoost算法的多级分类器, 用于在图像中检测目标对象. 它通过不断学习组合多个特征来识别目标对象. 每一级中, 级联分类器先检测出可能是目标对象的部分, 然后再这…

联合证券|港股再融资“春江水暖” 资本争购热门赛道企业

进入2023年&#xff0c;港股再融资商场有所回暖。到1月18日&#xff0c;已有27家港股上市公司发布拟配售股份&#xff08;简称“配股”&#xff09;再融资&#xff0c;募资总额164.01亿港元&#xff0c;较上一年同期增加148.16%。其间&#xff0c;微盟集团的配股再融资吸引了众…

python+selenium爬虫自动化批量下载文件

一、项目需求 在一个业务网站有可以一个个打开有相关内容的文本&#xff0c;需要逐个保存为TXT&#xff0c;数据量是以千为单位&#xff0c;人工操作会麻木到崩溃。 二、解决方案 目前的基础办法就是使用pythonselenium自动化来代替人工去操作&#xff0c;虽然效率比其他爬虫…

Java基础练习题(四)

13.求两点之间的距离 题目描述 给定A(x1, y1), B(x2, y2)两点坐标,计算它们间的距离。 输入 输入包含四个实数x1, y1, x2, y2,分别用空格隔开,含义如描述。其中0≤x1,x2,y1,y2≤100。 输出 输出占一行,包含一个实数d,表示A, B两点间的距离。结果保留两位小数。 样例输入