网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
- int param_3 = obj->top();
- int param_4 = obj->min();
*/
C
typedef struct {
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate() {
}
void minStackPush(MinStack* obj, int x) {
}
void minStackPop(MinStack* obj) {
}
int minStackTop(MinStack* obj) {
}
int minStackMin(MinStack* obj) {
}
void minStackFree(MinStack* 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);
*/
### 解题思路
此题要求写一个栈,与普通栈不同的是多出了一个获取最小值的方法。由于栈比较简单,这里就不多说了,主要还是说说怎么以 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) {
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新