剑指 Offer 30. 包含min函数的栈 - 力扣(LeetCode) (leetcode-cn.com)
首先放上运行结果:
思路
求一个数组的最小元素,除了用常规的排序、查找等方式之外,我们还可以用递归的思想来考虑问题:前n个数中的最小元素 = min(前n-1个数中的最小元素,第n个数)。结合栈只对栈顶元素进行操作的特点,我们可以将栈顶元素设置为一个struct,这个struct中有两个成员,val是当前栈顶元素的值,min_val是当前栈中所有元素的最小值,每次插入一个新元素x,只需将x和栈顶min_val相比较就能确定栈的最小元素值更新与否。
代码
class MinStack {
#define scale 0x1D4C //该数据是本题最大测试用例的规模
#define vacancy 0x7fffffff
struct e {
int val; //保存当前位置元素的值
int min_val; //从栈底到当前位置的所有元素中的最小值
};
e* stk;
int sp;
public:
/** initialize your data structure here. */
MinStack() {
stk = new e[scale + 1];
stk[0].val = vacancy;
stk[0].min_val = vacancy;
sp = 1;
}
void push(int x) {
stk[sp].val = x;
stk[sp].min_val = x < stk[sp - 1].min_val ? x : stk[sp - 1].min_val;
++sp;
}
void pop() {
--sp;
}
int top() {
return stk[sp - 1].val;
}
int min() {
return stk[sp - 1].min_val;
}
};