您好,登录后才能下订单哦!
实现一个最小栈,一步一步优化,从额外空间O(N) 到O(1) 。面试官看重代码逻辑。push,pop,top,getMin都是O(1)时间。
2个栈,data用来存储数据,minValue用来存储最小值。
push时,data直接push数据;minValue直接放入当前最小的值。(对于minValue有一个优化,当push的数据比当前最小值大的时候,我们可以不对minValue进行最小值的插入;如果小于或者等于最小值,就需要把最新的最小值push入栈minValue。
pop时,data直接pop出数据;同时,更新minValue,更新的策略是与push中的优化对应的策略——pop出的数,如果==当前的最小值,就需要把minValue进行pop一次。
getMin:直接返回栈minValue 的 top元素即可。
top: 直接返回栈data的top元素即可。
额外空间消耗O(N),如何优化到O(1).
public class MinStack1 { private Stack<Integer> data = new Stack<Integer>(); private Stack<Integer> minValue = new Stack<Integer>(); public void push(int x) {
data.push(x); if (minValue.isEmpty() || x <= minValue.peek())
minValue.push(x);
} public void pop() { int value = data.pop(); if (value == minValue.peek())
minValue.pop();
} public int top() { return data.peek();
} public int getMin() { return minValue.peek();
}
}如何只用一个栈实现最小栈的实现?
栈不能够只存储原始数据,应该存储差值。
用一个变量来计算栈的最小值
用简单的示例来探索思路。
入栈顺序:2,1,3,4,-2,0,-2
diff栈的计算 = data - min
| 出栈的data | 最小值 | diff栈 | 最小值min | |
|---|---|---|---|---|
| 2 | 2 | 0 | 2 | |
| 1 | 1 | -1 | 1 | |
| 3 | 1 | 2 | 1 | |
| 4 | 1 | 3 | 1 | |
| -2 | -2 | -3 | -2 | |
| 0 | -2 | 2 | -2 | |
| -2 | -2 | 0 | -2 |
top : 如何根据diff栈来恢复栈顶top的元素?push : 如何更新min最小值?pop : 如何维护min的最小值?
注意:第一次入栈diff的特殊处理。
public class MinStack3 { private Stack<Integer> diff = new Stack<Integer>(); private int minValue; public void push(int x) { if (diff.isEmpty()) {
minValue = x;
diff.push(0);
} else { int compare = x - minValue;
diff.push(compare);
minValue = compare < 0 ? x : minValue;
}
} public void pop() { int top = diff.peek();
minValue = top < 0 ? (minValue - top) : minValue;
diff.pop();
} public int top() { int top = diff.peek(); return top > 0 ? top + minValue : minValue;
} public int getMin() { return minValue;
}
}新航道雅思
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。