题解 | #包含min函数的栈#
包含min函数的栈
https://www.nowcoder.com/practice/4c776177d2c04c2494f2555c9fcc1e49
这题要求各个操作的时间复杂度都要是常数,那就意味着min这个求最小值过程不能用遍历。(不过看题目中给的数据范围,遍历应该也过得了。)那就只能采用以空间换时间的策略了,设置一个整数数组,第i个位置记录从栈底到第i个栈位置的区间的最小值(从0开始),push和pop操作都更新以栈顶位置为区间边界的区间最小值(这里偷懒并没有在pop操作里也更新)。这就是一个最简单的动态规划。其优势就是能立刻返回栈中元素的最小值,劣势也是显而易见的,即更大的空间开销。
class Solution {
public:
ListNode* stack;
int min_val = (1 << 31) - 1;
int rec_min[300]; //动态规划记录区间最小值
int len = 0;
void push(int value) {
if (!stack) {
stack = new ListNode(value);
} else {
ListNode* tmp = new ListNode(value);
tmp->next = stack;
stack = tmp;
}
if (!len) {
rec_min[0] = (stack->val < min_val) ? stack->val : min_val;
} else {
rec_min[len] = (stack->val < rec_min[len - 1]) ? stack->val : rec_min[len - 1];
}
len++;
}
void pop() {
if (len) {
ListNode* tmp = stack->next;
delete stack;
stack = tmp;
len--;
}
}
int top() {
if (len) {
return stack->val;
}
return NULL;
}
int min() {
return rec_min[len - 1];
}
};
