前言
记录一下自己的学习历程。说实话这是我第一次动手实现一个栈,一般我们都是等别人实现了拿着应用来给我们看的,其实还是自己动手好玩一些。
一、解题思路
这道题其实实现栈很容易,抄一下官方给的模板就好,但是要实现最小栈,MinStack这个类需要有一个最小值的属性。我一开始也只是照顾到push的过程最小值的更新,但是没有照顾到pop的过程中最小值也需要更新,所以第一次执行时候getMin的值是错误的。修改起来倒也不难。
有一个地方要注意,就是最小值属性一开始并不能设置为空,因为最小值是int类型的变量,null无法转变成int。这个问题我们可以根据题目给出的val的范围来解决,所以最小值的初始值是-2^31。
二、作业记录
1.作业代码(java)
代码如下:
class MinStack {
/** initialize your data structure here. */
private List<Integer> data;
private int min;
public MinStack() {
data = new ArrayList<>();
min = -2147483648;
}
public void push(int val) {
data.add(val);
if(min == -2147483648){
min = val;
}else if( val < min){
min = val;
}
}
public void pop() {
if(!data.isEmpty()){
data.remove(data.size()-1);
}
min = -2147483648;
int val, i;
for(i = 0; i < data.size();i++){
val = data.get(i);
if(min == -2147483648){
min = val;
}else if( val < min){
min = val;
}
}
}
public int top() {
return data.get(data.size()-1);
}
public int getMin() {
return min;
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
2.运行结果
结果如下:
似乎这样很慢啊。看来有必要优化一下代码,我认为问题应该是在pop函数重置最小值的运算量太大了。
优化的思路:因为每次栈就是从栈顶弹出一个元素,那么如果在push的时候记录每一个元素入栈时对应的栈的最小值,在pop的时候重置最小值就方便啦。于是将min也改成ArrayList。
3.优化后的作业代码(java)
class MinStack {
/** initialize your data structure here. */
private List<Integer> data;
private List<Integer> min;
public MinStack() {
data = new ArrayList<>();
min = new ArrayList<>();
}
public void push(int val) {
if(data.size() == 0){
data.add(val);
min.add(val);
}else{
int preMin;
data.add(val);
preMin = min.get(data.size()-2);
if( preMin <= val){
min.add( data.size()-1,preMin);
}else{
min.add( data.size()-1, val);
}
}
}
public void pop() {
if(!data.isEmpty()){
min.remove(data.size()-1);
data.remove(data.size()-1);
}
}
public int top() {
return data.get(data.size()-1);
}
public int getMin() {
return min.get(data.size()-1);
}
}
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
4.优化后的作业表现
用时方面改善了很多。
总结
既要考虑push操作时的最小值更新,也要考虑pop操作时的最小值更新,要让自己考虑问题时更加全面。