这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战
剑指 Offer 30. 包含min函数的栈
题目
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 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.
提示:
- 各函数的调用总次数不超过 20000 次
方法一
朴素方法:使用一个辅助栈stk2,来记录栈中的最小值;若新增元素比stk2中的栈顶元素小,则加到辅助栈中;出栈时,判断辅助栈的栈顶元素是否和出栈元素相等,若相等也得出栈;
class MinStack {
/** initialize your data structure here. */
LinkedList<Integer> stk1, stk2;
public MinStack() {
stk1 = new LinkedList<>();
stk2 = new LinkedList<>();
}
public void push(int x) {
stk1.addLast(x);
if(stk2.size() == 0 || stk2.getLast() >= x) stk2.addLast(x);
}
public void pop() {
if (stk2.size() > 0 && stk2.getLast().equals(stk1.getLast())) stk2.removeLast();
stk1.removeLast();
}
public int top() {
return stk1.getLast();
}
public int min() {
return stk2.getLast();
}
}
/**
* 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();
*/
时间复杂度: O(1)
空间复杂度: O(n)
剑指 Offer 31. 栈的压入、弹出序列
题目
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
示例 1:
输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
输出:true
解释:我们可以按以下顺序执行:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
示例 2:
输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出:false
解释:1 不能在 2 之前弹出。
提示:
0 <= pushed.length == popped.length <= 10000 <= pushed[i], popped[i] < 1000pushed 是 popped 的排列。
方法一
朴素方法:入栈数组中的元素依次入栈,若入栈元素等于当前出栈元素,则出栈,一直到不相等为止;最后判断入栈是否为空,空则正确,否则错误;
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
LinkedList<Integer> stk1, stk2;
stk1 = new LinkedList<>();
stk2 = new LinkedList<>();
for (int i = popped.length - 1; i >= 0; i --) stk2.addLast(popped[i]);
for (int i = 0; i < pushed.length; i ++ ) {
stk1.addLast(pushed[i]);
while(stk1.size() > 0 && stk1.getLast().equals(stk2.getLast())) {
stk1.removeLast();
stk2.removeLast();
}
}
while(stk1.size() > 0 && stk1.getLast().equals(stk2.getLast())) {
stk1.removeLast();
stk2.removeLast();
}
return stk1.size() == 0;
}
}
时间复杂度: O(n)
空间复杂度: O(n)