实现一个栈,该栈带有出栈(pop)、入栈(push)、取最小元素(getMin)3个方法。要保证这3个方法的时间复杂度都是O(1)

问题

实现一个栈,该栈带有出栈(pop)、入栈(push)、取最小元素(getMin)3个方法。要保证这3个方法的时间复杂度都是O(1)。

解释

为了实现一个栈,同时满足 poppushgetMin 操作的时间复杂度均为 O(1),我们需要在栈中存储元素的同时,额外维护一个最小值的信息。一个常见的方法是使用两个栈,一个用于存储实际元素(我们称之为 dataStack),另一个用于存储对应位置的最小值(我们称之为 minStack)。当 dataStack 进行 pushpop 操作时,minStack 也会进行相应的操作以保持同步,从而确保 getMin 操作的时间复杂度为 O(1)。

代码

java 复制代码
import java.util.Stack;  
  
public class MinStack {  
    // 用于存储实际数据的栈  
    private Stack<Integer> dataStack;  
    // 用于存储对应位置最小值的栈  
    private Stack<Integer> minStack;  
  
    /** initialize your data structure here. */  
    public MinStack() {  
        dataStack = new Stack<>();  
        minStack = new Stack<>();  
    }  
  
    public void push(int x) {  
        dataStack.push(x);  
        // 如果minStack为空,或者x小于等于minStack的栈顶元素,则将x也压入minStack  
        if (minStack.isEmpty() || x <= minStack.peek()) {  
            minStack.push(x);  
        }  
    }  
  
    public void pop() {  
        // 如果dataStack弹出的元素等于minStack的栈顶元素,则minStack也需要弹出  
        if (!dataStack.isEmpty() && dataStack.peek().equals(minStack.peek())) {  
            minStack.pop();  
        }  
        dataStack.pop();  
    }  
  
    public int top() {  
        // 栈不为空时,返回栈顶元素  
        if (!dataStack.isEmpty()) {  
            return dataStack.peek();  
        }  
        throw new RuntimeException("Stack is empty");  
    }  
  
    public int getMin() {  
        // 栈不为空时,返回最小值栈的栈顶元素  
        if (!minStack.isEmpty()) {  
            return minStack.peek();  
        }  
        throw new RuntimeException("Stack is empty");  
    }  
}  
  
// 示例用法  
public class Main {  
    public static void main(String[] args) {  
        MinStack minStack = new MinStack();  
        minStack.push(-2);  
        minStack.push(0);  
        minStack.push(-3);  
        System.out.println(minStack.getMin());   // 返回 -3  
        minStack.pop();  
        System.out.println(minStack.top());     // 返回 0  
        System.out.println(minStack.getMin());   // 返回 -2  
    }  
}

这段代码定义了一个 MinStack 类,它使用两个栈来分别维护数据和对应位置的最小值。push 操作会同时向两个栈中添加元素,而 pop 操作会检查两个栈的栈顶元素是否相同(即被移除的元素是否是当前最小值),如果是,则同时从两个栈中移除。通过这种方式,我们可以确保 getMin 操作的时间复杂度为 O(1)。

相关推荐
@yanyu66610 分钟前
idea中配置tomcat
java·mysql·tomcat
2501_9167665412 分钟前
【项目部署】JavaWeb、MavenJavaWeb项目部署至 Tomcat 的实现方式
java·tomcat
RoboWizard23 分钟前
扩容刚需 金士顿新款Canvas Plus存储卡
java·spring·缓存·电脑·金士顿
lang2015092839 分钟前
Spring Boot 入门:5分钟搭建Hello World
java·spring boot·后端
寂静山林1 小时前
UVa 10228 A Star not a Tree?
算法
失散131 小时前
分布式专题——47 ElasticSearch搜索相关性详解
java·分布式·elasticsearch·架构
serve the people1 小时前
LangChain 表达式语言核心组合:Prompt + LLM + OutputParser
java·langchain·prompt
想ai抽1 小时前
深入starrocks-多列联合统计一致性探查与策略(YY一下)
java·数据库·数据仓库
Neverfadeaway1 小时前
【C语言】深入理解函数指针数组应用(4)
c语言·开发语言·算法·回调函数·转移表·c语言实现计算器
武子康1 小时前
Java-152 深入浅出 MongoDB 索引详解 从 MongoDB B-树 到 MySQL B+树 索引机制、数据结构与应用场景的全面对比分析
java·开发语言·数据库·sql·mongodb·性能优化·nosql