
🚀 你好,欢迎来到《编程闯关记》! 这里是算法与数据结构的实战基地,也是你从“暴力解法”到“最优解”的进化场。 🔍 专栏初衷:
💡 如何使用本专栏: 1️⃣ 先独立思考:尝试自己写出第一版代码(哪怕很烂)。 2️⃣ 对比解法:看看我的思路和你的差异,吸收优化技巧。 3️⃣ 举一反三:每篇末尾会附相似题目链接,趁热打铁。 📌 坚持打卡: 算法没有捷径,但正确的方法能让你少走弯路。每天15分钟,和我一起用代码雕刻思维!
设计一个支持 push、pop、top 操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack 类:
MinStack() 初始化堆栈对象void push(int val) 将元素val推入堆栈void pop() 删除堆栈顶部的元素int top() 获取堆栈顶部的元素int getMin() 检索堆栈中的最小元素这道题的关键在于如何在常数时间内获取栈中的最小元素。普通栈只能访问栈顶元素,要获取最小值需要遍历整个栈,时间复杂度为O(n)。
为了实现O(1)时间获取最小值,我们可以使用辅助栈的方法:
这样,最小栈的栈顶元素始终是当前栈中的最小值。
#include <stack>
#include <stdexcept>
using namespace std;
// 最小栈的实现:普通栈 + 辅助栈
class MinStack {
public:
MinStack() {}
// 压栈操作
void push(int val) {
_st.push(val);
// 如果辅助栈为空,或者新值不大于当前最小值,则同步压入辅助栈
if (_minst.empty() || val <= _minst.top()) {
_minst.push(val);
}
}
// 出栈操作
void pop() {
if (_st.empty()) return; // 防御:空栈直接返回
if (_st.top() == _minst.top()) {
_minst.pop(); // 若栈顶是最小值,辅助栈同步出栈
}
_st.pop(); // 普通栈出栈
}
// 获取栈顶
int top() {
if (_st.empty()) throw runtime_error("stack is empty");
return _st.top();
}
// 获取最小值
int getMin() {
if (_minst.empty()) throw runtime_error("min stack is empty");
return _minst.top();
}
private:
stack<int> _st; // 普通栈:存所有元素
stack<int> _minst; // 辅助栈:只存最小值
};_st:普通栈,用于存储所有入栈的元素_minst:最小栈,只存储可能成为最小值的元素这道题是栈的经典应用题,通过辅助栈的方式实现了O(1)时间获取最小值的功能。关键点在于理解何时将元素压入最小栈,以及何时从最小栈弹出元素。这种双栈设计是解决此类问题的常用技巧。