问题来源
力扣的题:
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
我的代码
#include <iostream>
using namespace std;
#include <algorithm>
class MinStack {
public:
/** initialize your data structure here. */
MinStack() {
}
int minStack[20000] = { 0 };
int count = -1;
void push(int x) {
minStack[++count] = x;
cout << count;
}
void pop() {
count--;
}
int top() {
return minStack[count];
}
int min() {
return *min_element(minStack, minStack + count+1);
}
};
int main() {
MinStack *minStack = new MinStack();
(*minStack).push(-2);
minStack->push(0);
minStack->push(-3);
cout << minStack->min();
return 0;
}
力扣的示例代码
class MinStack {
private:
stack<long> _s;
long _min = INT_MAX;
public:
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
_s.push((long)x - _min);
if (x < _min) _min = x;
}
void pop() {
if (_s.top() < 0) _min -= _s.top();
_s.pop();
}
int top() {
return (_s.top() > 0) ? _s.top() + _min : _min;
}
int min() {
return _min;
}
};
/**
* 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();
*/
/*
* 3 2 5 1 9 0 1 0
* 3 2 1 0 0
*/
代码思考
看了示例代码,我感觉自己写的真的傻逼。我本来也想用栈来实现,打算用一个数来记录最小值。但是考虑到如果栈里有重复的数,那我就还得记录这个最小值有几个。而且如果最小值pop了,那我还得找到新的最小值,这感觉很难以O(1)的复杂度实现。
这个示例代码存入的每一个值都跟上一个值或者最小值有关,很妙。
C++代码问题
- new关键字创建对象时,因为这个类只有内置类型的成员,所以加不加括号没啥区别。
其他的各种关于括号的研究可以看这篇:https://blog.csdn.net/spaceyqy/article/details/22730939
MinStack *minStack = new MinStack();//new MinStack;
- 点运算与箭头运算的区别
我本来是想直接用点运算的,但是报错说“.push左边必须有类/结构/联合”。我就查了下,得按下面的两种方法写才行。意思就是,点运算是用在实体的,箭头运算是用在指针的。具体的说法可以看这篇:https://blog.csdn.net/weixin_51671868/article/details/120296543
(*minStack).push(-2);
minStack->push(0);