【剑指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)

 

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 };
View Code

压入有序

 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 };
View Code

 

posted @ 2022-11-14 18:25  啊原来是这样呀  阅读(30)  评论(0编辑  收藏  举报