/**
* 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();
*/
时间复杂度为:O(1),空间复杂度为:O(n)。
class MinStack {
Stack<Integer> stack ;
Stack<Integer> minStack;
/** initialize your data structure here. */
public MinStack() {
stack = new Stack<>();
minStack = new Stack<>();
}
public void push(int x) {
if(stack.isEmpty()){
stack.push(x);
minStack.push(x);
}else{
stack.push(x);
}
if(x <= minStack.peek()){// 这里不能只在小于的时候加入到min栈,需要设定<=
// 因为题目中没有说明不插入重复的数据,一开始在提交的时候,因为重复数据提交不通过
minStack.push(x);
}
}
public void pop() {
int temp = stack.pop();
if(temp == minStack.peek()){
minStack.pop();
}
}
public int top() {
return stack.peek();
}
public int min() {
return minStack.peek();
}
}
Code(标准简化的)
class MinStack {
Stack<Integer> A, B;
public MinStack() {
A = new Stack<>();
B = new Stack<>();
}
public void push(int x) {
A.add(x);
if(B.empty() || B.peek() >= x)
B.add(x);
}
public void pop() {
if(A.pop().equals(B.peek()))
B.pop();
}
public int top() {
return A.peek();
}
public int min() {
return B.peek();
}
}
作者:Krahets
链接:https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/solutions/133760/mian-shi-ti-30-bao-han-minhan-shu-de-zhan-fu-zhu-z/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
//一个辅助栈p-Min,初始都存入第一个数,后面每放进一个数,与x比大小,min栈栈顶小的话,下一元素存入min栈顶值,x小存x,总是min栈和原始栈一样多的元素,增加的话需要判断自身和x,小者存入;删的话都–;查的话,原始栈顶返回top;min值就返回mintop值;free就双栈都释放;
typedef struct {
int top;
int min_top;
int *stack;
int *min_stack;
} MinStack;
class MinStack {
/** initialize your data structure here. */
Stack stack1;
Stack stack2;
public MinStack() {
this.stack1 = new Stack();
this.stack2 = new Stack();
}
//进栈
public void push(int x) {
if(stack1.isEmpty()){
stack1.push(x);
stack2.push(x);
}else {
stack1.push(x);
if (x <= stack2.peek())
stack2.push(x);
}
}
//出栈
public void pop() {
if(stack2.peek().intValue()==stack1.peek().intValue()){
stack2.pop();
stack1.pop();
}else {
stack1.pop();
}
}
//获得栈顶元素
public int top() {
return stack1.peek();
}
//获得栈中最小值
public int min() {
return stack2.peek();
}
}
/**
* 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();
*/
class MinStack {
Stack<Integer> stack;
Stack<Integer> minStack;
/**
* initialize your data structure here.
*/
public MinStack() {
stack = new Stack<>();
minStack = new Stack<>();
}
public void push(int x) {
stack.push(x);
if (minStack.isEmpty() || minStack.peek() >= x) {
minStack.push(x);
}
}
public void pop() {
if (stack.pop() == minStack.peek()) {
minStack.pop();
}
}
public int top() {
return stack.peek();
}
public int min() {
return minStack.peek();
}
}
class MinStack {
Stack<Integer> stack1;
Stack<Integer> stack2;
/** initialize your data structure here. */
public MinStack() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void push(int x) {
stack1.push(x);
if (stack2.isEmpty() || x <= stack2.peek().intValue()) {
stack2.push(x);
}
}
public void pop() {
if(stack1.peek().intValue() == stack2.peek().intValue()) {
stack2.pop();
}
stack1.pop();
}
public int top() {
return stack1.peek();
}
public int min() {
return stack2.peek();
}
}
class MinStack {
// 初始化两个栈,1用于存储数值,2用于存储栈1的当前最小值
Stack stack1;
Stack stack2;
/** initialize your data structure here. */
public MinStack() {
stack1 = new Stack();
stack2 = new Stack();
}
public void push(int x) {
stack1.push(x);
// 栈2也压入第一个值;当压入栈1的数值小于之前的最小值时,一并压入栈2
if(stack2.isEmpty() || x <= stack2.peek().intValue()){
stack2.push(x);
}
}
public void pop() {
// 栈1还有值时,出栈操作
if(!stack1.isEmpty()){
// 判断出栈值是否为当前最小值,True则1和2一并出栈
// 当压入的数值大小超过127时,peek操作读取的是对象比较会出错,所以强制转换为int数值
if(stack1.peek().intValue() == stack2.peek().intValue()){
stack2.pop();
}
}
stack1.pop();
}
public int top() {
return stack1.peek();
}
public int min() {
return stack2.peek();
}
}
下面是保存差值法,不需要使用额外的栈。
class MinStack {
Stack stack;
Long min;
/** initialize your data structure here. */
public MinStack() {
stack = new Stack<>();
}
public void push(int x) {
if (stack.isEmpty()) {
stack.push(0l);
min = Long.valueOf(x);
} else {
stack.push((long) (x - min));
min = Math.min(x, min);
}
}
public void pop() {
if (stack.peek() < 0) {
min = min - stack.pop();
return;
}
stack.pop();
}
public int top() {
if (stack.peek() > 0) {
return (int) (min + stack.peek());
} else {
return Math.toIntExact(min);
}
}
public int min() {
return Math.toIntExact(min);
}
}
共以下 28 个回答
#include<stdio.h>
#include<stdlib.h>
typedef struct StackNode
{
int data;
int min;
struct StackNode * next;
}StackNode;
typedef struct MinStack
{
StackNode * top;
}MinStack;
MinStack * init_MinStack()//初始化栈
{
MinStack * stack = (MinStack *)malloc(sizeof(MinStack));
stack->top = NULL;
return stack;
}
int isEmpty(MinStack * stack)//判断是否为空栈
{
return stack->top NULL;
}
void push(MinStack * stack , int value)//入栈
{
StackNodenewNode = (StackNode)malloc(sizeof(StackNode));
newNode->data = value;
if(isEmpty(stack))
{
newNode->min = value;
}
else
{
int currentMin stack->top->min;
newNode->min = (value<currentMin)? value:currentMin;
}
}
int pop(MinStack *stack)//出栈
{
if(isEmpty(stack))
{
printf(” error: stack is empty\n”);
return -1;
}
StackNode * tmp = stack->top;
int popValue = tmp->data;
stack->top = tmp->next;
free(tmp);
return popValue;
}
int top(MinStack * stack)//打印栈顶
{
if(isEmpty(stack))
{
printf(” error: stack is empty\n”);
return -1;
}
}
int getMin(MinStack * stack)//获取最小栈
{
if(isEmpty(stack))
{
printf(” error: stack is empty\n”);
return -1;
}
return stack->top->min;
}
void freeMinStack(MinStack * stack)//释放栈
{
while(!isEmpty(stack))
{
pop(stack);
}
free(stack);
}
//总体时间复杂度o(1),空间复杂度o(1)
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
private: s1, s2;
stack
};
/**
* 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();
*/
时间复杂度为:O(1),空间复杂度为:O(n)。
打卡
剑指 Offer 30. 包含min函数的栈
思路
解题方法1
复杂度
时间复杂度:
空间复杂度:
Code(自己写的)
Code(标准简化的)
帅地版本
解题方法2(待补充)
复杂度
时间复杂度:
空间复杂度:
Code
#python题解:
#空间复杂度:n
#时间复杂度:1
class MinStack(object):
class MinStack { s1{}, s2{};
std::stack
public:
/** initialize your data structure here. */
MinStack() {
s2.push(INT_MAX);
}
};
时间复杂度:o(n)
空间复杂度:o(n)
class MinStack { restack, minstack; // minstack负责存放最小元素
stack
public:
/** initialize your data structure here. */
MinStack() {
};
//采用辅助栈的方法,第二栈用于存储最小的值;
//插入和删除时间复杂度都为o(1);
//空间复杂度为o(n);
class MinStack { stack1; stack2;//辅助栈
public:
/** initialize your data structure here. */
stack
stack
};
时间复杂度:O(1) stack1; stack2;
空间复杂度:O(n)
class MinStack {
public:
/** initialize your data structure here. */
stack
stack
MinStack() {
};
//一个辅助栈p-Min,初始都存入第一个数,后面每放进一个数,与x比大小,min栈栈顶小的话,下一元素存入min栈顶值,x小存x,总是min栈和原始栈一样多的元素,增加的话需要判断自身和x,小者存入;删的话都–;查的话,原始栈顶返回top;min值就返回mintop值;free就双栈都释放;
typedef struct {
int top;
int min_top;
int *stack;
int *min_stack;
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate() {
MinStack* obj = (MinStack *)malloc(sizeof(MinStack));
obj->stack = (int *)malloc(sizeof(int) * 10000);
obj->min_stack = (int *)malloc(sizeof(int) * 10000);
obj->top = -1;
obj->min_top = -1;
return obj;
}
void minStackPush(MinStack* obj, int x) {
obj->stack[++obj->top] = x;//将x入栈stack
// if(obj->min_top -1)//若栈min_stack为空,将x入栈
// obj->min_stack[++obj->min_top] = x;
// else if(obj->min_stack[obj->min_top] >= x)//x小于等于栈min_stack的栈顶元素,则将x入栈
// obj->min_stack[++obj->min_top] = x;
if(obj->min_top -1)//若栈min_stack为空,将x入栈
obj->min_stack[++obj->min_top] = x;
else{
if(obj->min_stack[obj->min_top] >= x){
obj->min_stack[++obj->min_top] = x;
}
else{
obj->min_stack[++obj->min_top] = obj->min_stack[obj->min_top] ;
}
}
void minStackPop(MinStack* obj) {
}
int minStackTop(MinStack* obj) {
return obj->stack[obj->top];//top函数返回栈的栈顶元素,所以返回stack的栈顶元素
}
int minStackMin(MinStack* obj) {
return obj->min_stack[obj->min_top];//min函数返回栈的最小元素,所以返回min_stack的栈顶元素
}
void minStackFree(MinStack* obj) {
free(obj->stack);
free(obj->min_stack);
free(obj);
}
/**
* Your MinStack struct will be instantiated and called as such:
* MinStack* obj = minStackCreate();
* minStackPush(obj, x);
minStackPop(obj);
int param_3 = minStackTop(obj);
int param_4 = minStackMin(obj);
minStackFree(obj);
*/
时间O(1)空间O(N)
暴力解法
直接看的解答代码 stack1; stack2; (); ();//存放所有最小值
”’java
import java.util.Stack;
//定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min()函数
//并且调用min push pop 的时间复杂度都是O(1)
//使用两个栈,一个是正常的,一个放置最小元素,每次push都将更小的元素放进去,pop的时候判断是否出栈
class MinStack {
Stack
Stack
public MinStack() {
this.stack1 = new Stack
this.stack2 = new Stack
}
}
用一个栈A存数据,用另一个栈B存储当前的最小值,如果栈A弹出的值正好是B的栈顶元素,B也弹出。
“`python
#时间复杂度O(1),牺牲了空间复杂度,没想到pop()里面还是用pop()
class MinStack:
“`python
時間複雜度 O(1) 空間複雜度 O(n)
輔助棧
空間複雜度 O(1) 解法
儲存 min跟壓入值的差值, 只要儲存的值小於0則表示該差值對應的原始值為當前的最小值
刚开始想的是用第二个栈在求最小值时遍历一遍再放回第一个栈
结果超时
看了下讲解才明白
但这行代码要加 .intValue()才没出错是我没想到的
使用最小栈
时间O(1) 空间O(n)
一个普通栈一个保存当前元素前最小值的栈
辅助栈实现
+ 空间复杂度:O(N),
+ 时间复杂度: O(1)。
下面是保存差值法,不需要使用额外的栈。
1、辅助栈。把最小的那一个存入辅助栈。
辅助栈