【剑指offer】31.包含min函数的栈
总目录:
1.问题描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的 min 函数,输入操作时保证 pop、top 和 min 函数操作时,栈中一定有元素。
此栈包含的方法有:
push(value):将value压入栈中
pop():弹出栈顶元素
top():获取栈顶元素
min():获取栈中最小元素
数据范围:操作数量满足 0≤n≤300 0≤n≤300 ,输入的元素满足 ∣val∣≤10000 ∣val∣≤10000
进阶:栈的各个操作的时间复杂度是 O(1) ,空间复杂度是 O(n)
进阶:栈的各个操作的时间复杂度是 O(1) ,空间复杂度是 O(n)
2.问题分析
都是用2个栈
1调用min的时候现查,使用栈2作缓存,时间复杂度O(n)
2压入时不仅压入栈1,还按一定的规则压入栈2,保持栈2中的top始终是最小值,调用min的时候直接返回
3.代码实例
现查法
1 class Solution { 2 public: 3 void push(int value) { 4 st1.push(value); 5 } 6 void pop() { 7 st1.pop(); 8 } 9 int top() { 10 return st1.top(); 11 } 12 int min() { 13 int minVal = maxVal; 14 while (!st1.empty()) { 15 tmpVal = st1.top(); 16 st1.pop(); 17 st2.push(tmpVal); 18 19 minVal = minVal > tmpVal ? tmpVal : minVal; 20 } 21 while (!st2.empty()) { 22 tmpVal = st2.top(); 23 st2.pop(); 24 st1.push(tmpVal); 25 } 26 27 return minVal; 28 } 29 30 private: 31 const int maxVal = 10000;//最大值 32 int tmpVal = 0; 33 stack<int> st1; 34 stack<int> st2; 35 };
压入有序
1 class Solution { 2 public: 3 void push(int value) { 4 st1.push(value); 5 if (st2.empty() || value < st2.top()) { 6 st2.push(value); 7 } else { 8 st2.push(st2.top());//依然压入当前的全局最小值 9 } 10 11 } 12 void pop() { 13 st1.pop(); 14 st2.pop(); 15 } 16 int top() { 17 return st1.top(); 18 } 19 int min() { 20 return st2.top(); 21 } 22 23 private: 24 const int maxVal = 10000;//最大值 25 int tmpVal = 0; 26 stack<int> st1; 27 stack<int> st2; 28 };