既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
-
minStackPush(obj, x);
-
minStackPop(obj);
-
int param_3 = minStackTop(obj);
-
int param_4 = minStackMin(obj);
-
minStackFree(obj);
*/
### 解题思路
此题要求写一个栈,与普通栈不同的是多出了一个获取最小值的方法。由于栈比较简单,这里就不多说了,主要还是说说怎么以 O(1) 的时间复杂度查找栈中的最小值。
使用一个变量 min 记录每次栈中的最小值,每次有元素进栈都对 min 进行更新。
这个方法存在一个问题,没有考虑出栈时,怎么对 min 进行更新。
为了解决出栈对最小值的更新,可以设定一个辅助栈,栈顶表示当前数据栈中的最小值,每次有元素入栈,就将当前最小值入辅助栈。出栈时,辅助栈也要将栈顶元素出栈,这就解决了出栈时的最小值更新问题。
push:将数据入栈的同时,更新最小值。如果入栈元素大于辅助栈顶元素(也就是元素入栈前,数据栈中的最小值),则最小值依旧是数据栈原来的最小值,否则将元素入辅助栈。
![GIF 2021-8-6 18-17-13.gif](https://img-blog.csdnimg.cn/img_convert/d16c07a1df82446347ea139dce8197f9.gif)
**pop**:将数据栈和辅助栈的栈顶元素同时出栈,保持辅助栈的栈顶元素是数据栈中的最小值。
![GIF 2021-8-6 18-23-10.gif](https://img-blog.csdnimg.cn/img_convert/77d13c246b407d1b9e6e6333393c5a63.gif)
C
#define max_size 10000
//x_stack存储正常入栈元素,min_stack用来存储入栈时栈中最小的元素
//x_top和min_top分别为栈顶的下标
//min_value用来存储最小值
typedef struct {
int *x_stack;
int *min_stack;
int x_top;
int min_top;
int min_value;
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate() {
MinStack obj = (MinStack)malloc(sizeof(MinStack));
obj->x_stack = (int*)malloc(sizeof(int) * max_size);
obj->min_stack = (int*)malloc(sizeof(int) * max_size);
obj->min_top = obj->x_top = -1;
obj->min_value = 0;
return obj;
}
void minStackPush(MinStack* obj, int x) {
if(obj->x_top < max_size)
{
if(obj->x_top == -1)
obj->min_value = x;
obj->x_stack[++(obj->x_top)] = x;
if(x < obj->min_value)
obj->min_value = x; //当前元素比min_value小时改变min_value
obj->min_stack[++(obj->min_top)] = obj->min_value;
}
}
void minStackPop(MinStack* obj) {
–(obj->x_top);
–(obj->min_top);
if(obj->min_top != -1)
obj->min_value = obj->min_stack[obj->min_top];//出栈后将min_value变成min_stack的栈顶元素
}
int minStackTop(MinStack* obj) {
return obj->x_stack[obj->x_top];
}
int minStackMin(MinStack* obj) {
return obj->min_stack[obj->min_top];
}
void minStackFree(MinStack* obj) {
free(obj->x_stack);
free(obj->min_stack);
free(obj);
}
/**
-
Your MinStack struct will be instantiated and called as such:
-
MinStack* obj = minStackCreate();
-
minStackPush(obj, x);
-
minStackPop(obj);
-
int param_3 = minStackTop(obj);
-
int param_4 = minStackMin(obj);
-
minStackFree(obj);
*/
C++
方法:维护一个数据栈和一个辅助栈。数据栈用于存放每次新进入的x,辅助栈用于存放每个x进入数据栈后,数据栈中已有元素的最小值(即辅助栈的top()始终存放着当前数据栈的最小值)。数据栈中的元素个数始终等于辅
助栈中的元素个数。
先放C++代码,思路简单易懂。
class MinStack {
public:
/** initialize your data structure here. */
stack data, help;
MinStack() {
}
void push(int x) {
data.push(x);
// 如果x是data和help的第一个元素,或者x小于等于help的最小元素,入栈
if(help.empty() || x <= help.top()) help.push(x);
if(x > help.top())
{
// 如果x大于help的最小元素,向help中再压入一遍该最小元素,保持两个栈元素个数相等
// 比如data里现在有3,help里现在也有3,data里压入一个4,那么help里压入一个3
// 这样如果把data的4弹出,我们同步把help的3也弹出
int temp = help.top();
help.push(temp);
}
}
void pop() {
if(!data.empty() && !help.empty())
{
data.pop();
help.pop();
}
}
int top() {
return data.top();
}
int min() {
return help.top();
}
};
/**
- Your MinStack object will be instantiated and called as such:
- MinStack* obj = new MinStack();
- obj->push(x);
- obj->pop();
- int param_3 = obj->top();
- int param_4 = obj->min();
*/
![img](https://img-blog.csdnimg.cn/img_convert/cb84a13200beb782a0c78fb0c2e55cf6.png)
![img](https://img-blog.csdnimg.cn/img_convert/7342688637040a1fdd435df2d7308d40.png)
![img](https://img-blog.csdnimg.cn/img_convert/8cdd88cebfb34ff9590e131778e3ca75.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**
础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**