本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析
- 这个题意简洁明了。我们解决这个问题,需要熟练应用栈这种数据结构。
- 栈这种数据结构,具有后进先出(last in first out)的性质。
- 在 Java 中,我常常使用 Deque 来实现 Stack的功能。 Deque 是双端队列,使用起来更加方便。
- 具体到这个题目,我自定义了 StackNode 数据结构,其中存储了当前的节点值和当前节点值在 Stack 中的最小值。从而满足题目要求。
AC 代码
class MinStack {
Deque<StackNode> stack;
/** initialize your data structure here. */
public MinStack() {
stack = new ArrayDeque<>();
}
public void push(int x) {
StackNode node;
if (stack.isEmpty()) {
node = new StackNode(x, x);
} else {
node = new StackNode(x, Math.min(x,stack.peek().getMinVal()));
}
stack.push(node);
}
public void pop() {
stack.pop();
}
public int top() {
return stack.peek().getCurrentVal();
}
public int min() {
return stack.peek().getMinVal();
}
}
class StackNode {
Integer currentVal;
Integer minVal;
public StackNode(Integer currentVal, Integer minVal) {
this.currentVal = currentVal;
this.minVal = minVal;
}
public Integer getCurrentVal() {
return currentVal;
}
public void setCurrentVal(Integer currentVal) {
this.currentVal = currentVal;
}
public Integer getMinVal() {
return minVal;
}
public void setMinVal(Integer minVal) {
this.minVal = minVal;
}
}
/**
* 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();
*/
提交测试
顺利AC!
总结
- 上述代码的时间复杂度是 O(1), 空间复杂度是 O(n)
- 算法题目需要多练习,不仅要看,也要写,才能有更好的收获!
- 坚持每日一题,加油!