带你快速刷完67道剑指offer
如果你想在校招中顺利拿到更好的offer,阿秀建议你多看看前人的经验 ,比如准备 、简历 、实习 、校招总结 、offer选择 、也欢迎来一起参加秋招打卡活动 等;如果你是计算机小白,学习/转行/校招路上感到迷茫或者需要帮助,可以点此联系阿秀;免费分享阿秀个人学习计算机以来的收集到的好资源,点此白嫖;如果你需要《阿秀的学习笔记》网站中求职相关知识点的PDF版本的话,可以点此下载
# No20、包含min函数的栈
# 题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
# 1、一次解决 以前做过
class Solution {
public:
void push(int value) {
if(st.size()==0&&minSt.size()==0) {
st.push(value);
minSt.push(value);
}else{
st.push(value);
if(value<=minSt.top()){
minSt.push(value);
}
else{
minSt.push(minSt.top());
}
}
//st.push(value); #这里应该删除
}
void pop() {
st.pop();
minSt.pop();
}
int top() {
return st.top();
}
int min() {
return minSt.top();
}
stack<int> minSt;
stack<int> st;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
感谢微信好友“Pikachuts”指出笔误,现在改正,多谢。-2021.06.11
# 二刷:
# 1、只一个栈来做,维持一个最小值,这种方法毫无疑问是更好一点的
运行时间:2ms 占用内存:504k
注意函数重名问题
class Solution {
int minNum = INT_MAX;
stack<int> st;
public:
void push(int value) {
minNum = std::min(value, minNum);//注意当前类中也有一个min函数,
//所以我们需要明确此时的min函数是哪个函数
st.push(minNum);
st.push(value);
}
void pop() {
st.pop();//pop掉当前值
st.pop();//pop掉当前最小值
int temp = st.top();
st.pop();
if(minNum == st.top()){
st.push(temp);
}else{
minNum = st.top();
st.pop();
st.push(minNum);
st.push(temp);
}
}
int top() {
return st.top();
}
int min() {
return minNum;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34