剑指Offer - 九度1522 - 包含min函数的栈
2013-12-01 23:44
- 题目描述:
-
定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。
- 输入:
-
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为一个整数n(1<=n<=1000000), n代表将要输入的操作的步骤数。
接下来有n行,每行开始有一个字母Ci。
Ci=’s’时,接下有一个数字k,代表将k压入栈。
Ci=’o’时,弹出栈顶元素。
- 输出:
-
对应每个测试案例中的每个操作,
若栈不为空,输出相应的栈中最小元素。否则,输出NULL。
- 样例输入:
-
7 s 3 s 4 s 2 s 1 o o s 0
- 样例输出:
-
3 3 2 1 2 3 0
题意分析:
默认的栈不论pop还是push都是O(1)时间的操作,如果想得到最小元素的话,还得用O(n)的复杂度去扫描得出。因此,我们另外用一个栈来记录最小元素,将原本O(n)的操作分配到每一次操作中,实现平均O(1)的复杂度。思路如下:
1. 两个栈s和smin。s表示元素栈,就是普通的堆栈,存储所有元素。smin是最小栈,只存最小元素。
2. 栈为空时,push操作直接入栈s和smin,pop操作无效。
3. push入栈时,对于s直接push;对于smin,如果当前元素不大于smin的栈顶元素,则push,否则跳过。
4. pop出栈时,对于s直接pop;对于smin,如果pop出的元素不大于smin的栈顶元素,则pop,否则跳过。
5. smin的栈顶元素就是所有元素的最小值。
其实可以这么想,元素进进出出,有大有小。每当有更小的元素进来以后,最小值才会更新,如果某个最小值的元素被pop了,那么最小值就变回了原来排第二小的值。所以我们可以把最小值按先后顺序记录下来,形成的就是一个单调递减(不严格)的数列,这个数列就是smin。
pop操作、push操作、min操作都是O(1)时间复杂度。需要维持额外的O(n)空间来记录最小栈,所以空间复杂度是O(n)。以下是ac代码。
1 // 652500 zhuli19901106 1522 Accepted 点击此处查看所有case的执行结果 1024KB 872B 20MS 2 // 201311170256 3 #include <cstdio> 4 #include <vector> 5 using namespace std; 6 7 int main() 8 { 9 int n; 10 int i; 11 int tmp; 12 vector<int> st, min_st; 13 char s[10]; 14 15 while(scanf("%d", &n) == 1){ 16 st.clear(); 17 min_st.clear(); 18 for(i = 0; i < n; ++i){ 19 scanf("%s", s); 20 if(s[0] == 's'){ 21 scanf("%d", &tmp); 22 st.push_back(tmp); 23 if(min_st.size() <= 0 || tmp <= min_st[min_st.size() - 1]){ 24 min_st.push_back(tmp); 25 } 26 }else if(s[0] == 'o'){ 27 if(st.size() > 0 && min_st.size() > 0){ 28 if(st[st.size() - 1] <= min_st[min_st.size() - 1]){ 29 min_st.pop_back(); 30 } 31 st.pop_back(); 32 } 33 } 34 35 if(min_st.size() > 0){ 36 printf("%d\n", min_st[min_st.size() - 1]); 37 }else{ 38 printf("NULL\n"); 39 } 40 } 41 } 42 43 return 0; 44 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)