最小栈(leetcode 155)

Posted 恋喵大鲤鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最小栈(leetcode 155)相关的知识,希望对你有一定的参考价值。

文章目录

1.问题描述

设计一个支持 push,pop,top 和 min 操作的栈,min 为获取栈中的最小元素,要求 push、pop、top 和 min 都是 O(1) 时间复杂度。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int v) 将元素 v 推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int min() 获取堆栈中的最小元素。

2.难度等级

medium。

3.热门指数

★★★★☆

出题公司:腾讯、虾皮。

4.解题思路

因为要在常数时间内检索到最小元素,我们可以利用空间换时间的思想,使用辅助栈来记录最小元素。

按照上面的思路,我们只需要设计一个数据结构,使得每个元素 a 与其相应的最小值 m 时刻保持一一对应。因此我们可以使用一个辅助栈,与元素栈同步插入与删除,用于存储与每个元素对应的最小值。

当一个元素要入栈时,我们取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将这个最小值插入辅助栈中;

当一个元素要出栈时,我们把辅助栈的栈顶元素也一并弹出;

在任意一个时刻,栈内元素的最小值就存储在辅助栈的栈顶。

复杂度分析:

时间复杂度:因为栈的插入、删除与读取操作都是 O(1),我们定义的每个操作最多调用栈操作两次。

空间复杂度:如果栈中的元素为 n,那么辅助栈空间也为 n,所以空间复杂度为 O(n)。

5.实现示例

5.1 C++

#include <limits.h>
#include <stack>

class MinStack 
    stack<int> x_stack;
    stack<int> min_stack;
public:
    MinStack() 
        min_stack.push(INT_MAX);
    
    
    void push(int x) 
        x_stack.push(x);
        min_stack.push(std::min(min_stack.top(), x));
    
    
    void pop() 
        x_stack.pop();
        min_stack.pop();
    
    
    int top() 
        return x_stack.top();
    
    
    int min() 
        return min_stack.top();
    
;

5.2 Golang

import "math"

type MinStack struct 
    stack []int
    minStack []int


func Constructor() MinStack 
    return MinStack
        stack: []int,
        minStack: []intmath.MaxInt64,
    


func (this *MinStack) Push(x int)  
    this.stack = append(this.stack, x)
    top := this.minStack[len(this.minStack)-1]
    this.minStack = append(this.minStack, min(x, top))


func (this *MinStack) Pop()  
    this.stack = this.stack[:len(this.stack)-1]
    this.minStack = this.minStack[:len(this.minStack)-1]


func (this *MinStack) Top() int 
    return this.stack[len(this.stack)-1]


func (this *MinStack) Min() int 
    return this.minStack[len(this.minStack)-1]


func min(x, y int) int 
    if x < y 
        return x
    
    return y

5.3 Java

class MinStack 
    Deque<Integer> xStack;
    Deque<Integer> minStack;

    public MinStack() 
        xStack = new LinkedList<Integer>();
        minStack = new LinkedList<Integer>();
        minStack.push(Integer.MAX_VALUE);
    
    
    public void push(int x) 
        xStack.push(x);
        minStack.push(Math.min(minStack.peek(), x));
    
    
    public void pop() 
        xStack.pop();
        minStack.pop();
    
    
    public int top() 
        return xStack.peek();
    
    
    public int min() 
        return minStack.peek();
    


参考文献

155.最小栈 - LeetCode

以上是关于最小栈(leetcode 155)的主要内容,如果未能解决你的问题,请参考以下文章

[JavaScript 刷题] 栈 - 最小栈, leetcode 155

155.最小栈-力扣(LeetCode)

155.最小栈-力扣(LeetCode)

JS Leetcode 155. 最小栈 题解分析

栈最小栈(LeetCode155)

栈最小栈(LeetCode155)