剑指Offer 30 31

145 阅读2分钟

这是我参与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 <= 1000
  • 0 <= pushed[i], popped[i] < 1000
  • pushed 是 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)