0
点赞
收藏
分享

微信扫一扫

[数组]BM43 包含min函数的栈-简单

哈哈镜6567 2022-06-17 阅读 79

​​BM43 包含min函数的栈​​

描述

定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 poptop 和 min 函数操作时,栈中一定有元素。

此栈包含的方法有:push(value):将value压入栈中pop():弹出栈顶元素top():获取栈顶元素min():获取栈中最小元素

数据范围:操作数量满足 [数组]BM43 包含min函数的栈-简单_栈 ,输入的元素满足 [数组]BM43 包含min函数的栈-简单_栈_02

进阶:栈的各个操作的时间复杂度是 [数组]BM43 包含min函数的栈-简单_栈_03 ,空间复杂度是 [数组]BM43 包含min函数的栈-简单_栈_04


示例:输入:    ["PSH-1","PSH2","MIN","TOP","POP","PSH1","TOP","MIN"]输出:    -1,2,1,-1解析:"PSH-1"表示将-1压入栈中,栈中元素为-1"PSH2"表示将2压入栈中,栈中元素为2,-1“MIN”表示获取此时栈中最小元素==>返回-1"TOP"表示获取栈顶元素==>返回2"POP"表示弹出栈顶元素,弹出2,栈中元素为-1"PSH1"表示将1压入栈中,栈中元素为1,-1

"TOP"表示获取栈顶元素==>返回1“MIN”表示获取此时栈中最小元素==>返回-1


示例1

输入:

["PSH-1","PSH2","MIN","TOP","POP","PSH1","TOP","MIN"]

复制返回值:

-1,2,1,-1

题解

使用2个栈的实现

步骤:

  1. 用normal_stack进行入栈、出栈操作,用min_stack进行最小值的更新
  2. push(x):如果x小于等于min_stack栈顶元素,或者min_stack为空,将x放入norm_stack的同时,也放入min_stack
  3. pop():如果norm_stack.top()的值小于等于min_stack.top的值,在norm_stack出栈的同时,将min_stack也出栈

实现如下:

// https://www.nowcoder.com/practice/4c776177d2c04c2494f2555c9fcc1e49?tpId=295&tags=&title=&difficulty=0&judgeStatus=0&rp=0&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D295

#include <bits/stdc++.h>

class Solution
{
public:
void push(int value)
{
normal_stack.push(value);
if (min_stack.empty() || value <= min_stack.top())
{
min_stack.push(value);
}
}

void pop()
{
int n = normal_stack.top();
normal_stack.pop();
if (n == min_stack.top())
{
min_stack.pop();
}
}
int top()
{
return normal_stack.top();
}
int min()
{
return min_stack.top();
}

private:
std::stack<int> normal_stack;
std::stack<int> min_stack;
};


牛客网官方题解

牛客网的官方题解,也是使用2个栈。唯一的不同点是,push(x)的时候,如果x的值大于min_stack,则将min_stack的栈顶元素重复放入min_stack中,目的是为了在进行pop的时候,数量和norm_stack一致,避免pop的时候的判断。

代码如下:

class Solution {
public:
//用于栈的push 与 pop
stack<int> s1;
//用于存储最小min
stack<int> s2;
void push(int value) {
s1.push(value);
//空或者新元素较小,则入栈
if(s2.empty() || s2.top() > value)
s2.push(value);
else
//重复加入栈顶
s2.push(s2.top());
}
void pop() {
s1.pop();
s2.pop();
}
int top() {
return s1.top();
}
int min() {
return s2.top();
}
};
举报

相关推荐

0 条评论