LeetCode最小栈

class MinStack {
public: 
    stack<int> ans;
    stack<int> min_ans;
    MinStack() {
        min_ans.push(INT_MAX);
    }
    
    void push(int val) {
        if(val<=min_ans.top()) min_ans.push(val);
        ans.push(val);
    }
    
    void pop() {
        if(!ans.empty()){
        if(min_ans.top()==ans.top()) min_ans.pop();
        ans.pop();
        }
    }
    
    int top() {
        return ans.top();
    }
    
    int getMin() {
        return min_ans.top();
    }
};

/**
 * Your MinStack object will be instantiated and called as such:
 * MinStack* obj = new MinStack();
 * obj->push(val);
 * obj->pop();
 * int param_3 = obj->top();
 * int param_4 = obj->getMin();
 */不修改代码给出详细思路与具体运行步骤

📌 代码思路

该 MinStack 设计了两个栈:

1. ans(正常栈):存储所有入栈的元素,支持 push()、pop() 和 top() 操作。

2. min_ans(最小值栈):用于存储当前栈中的最小元素,使 getMin() 操作在 O(1) 时间内完成。

🔹 核心逻辑

push(val)

• ans.push(val):将元素正常入栈。

• 如果 val 小于或等于 min_ans.top(),则 min_ans.push(val),维护最小值栈。

pop()

• 先检查 ans 是否为空。

• 如果 ans.top() 等于 min_ans.top(),则 min_ans.pop(),同步删除最小值栈的顶端元素。

• ans.pop() 执行正常的出栈操作。

top()

• 直接返回 ans.top(),即栈顶元素。

getMin()

• 直接返回 min_ans.top(),即当前栈中的最小值。

📌 运行步骤

我们以 MinStack 的典型操作为例,来详细分析执行过程。

🔹 代码示例

MinStack* obj = new MinStack();
obj->push(-2);
obj->push(0);
obj->push(-3);
cout << obj->getMin() << endl; // 输出 -3
obj->pop();
cout << obj->top() << endl;    // 输出 0
cout << obj->getMin() << endl; // 输出 -2

📌 具体执行过程

操作

ans 栈 (正常栈)

min_ans 栈 (最小值栈)

说明

push(-2)

[-2]

[-2]

-2 入栈,更新最小值栈

push(0)

[-2, 0]

[-2]

0 入栈,不更新最小值栈

push(-3)

[-2, 0, -3]

[-2, -3]

-3 入栈,更新最小值栈

getMin()

[-2, 0, -3]

[-2, -3]

返回 -3

pop()

[-2, 0]

[-2]

-3 出栈,同时 min_ans 也出栈

top()

[-2, 0]

[-2]

返回 0

getMin()

[-2, 0]

[-2]

返回 -2

📌 复杂度分析

push():O(1)(每次操作最多 push 两个栈)

pop():O(1)(最多 pop 两个栈)

top():O(1)(直接返回 ans.top())

getMin():O(1)(直接返回 min_ans.top())

📌 总结

✅ 这个 MinStack 通过两个栈(一个存数据,一个存最小值)巧妙地保持了 O(1) 的最小值查询时间

✅ min_ans 只存递减的最小值,因此在 pop() 时同步出栈。

✅ 代码逻辑清晰,执行步骤严谨,没有问题。 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值