Descending Stack

即Stack中只包含递减的元素,适用于非有序数组,求数组中元素大小关系的问题。 [Daily Temperatures] 这道题目里数组是无序的,而运用递减stack,这样当新的元素与stack元素比较时候

  • 如果大于栈顶元素,则满足要求,当前元素即为大于栈顶元素的第一个数。并且可以一直跟新的栈顶元素进行比较,更新答案,直到遇到比他大的
  • 如果小于栈顶元素,那么直接加入stack,这样仍然保持着一个descending stack
class Solution {
    class Pair {
        int pos;
        int val;
        public Pair(int val, int pos) {
            this.val = val;
            this.pos = pos;
        }
    }
    public int[] dailyTemperatures(int[] T) {
        int[] ans = new int[T.length];
        Stack<Pair> stack = new Stack<>();

        for (int i = 0; i < T.length; i++) {            
            while (!stack.isEmpty() && T[i] > stack.peek().val) {
                Pair p = stack.pop();
                ans[p.pos] = i - p.pos;                
            }
            stack.push(new Pair(T[i], i));                
        }        
        return ans;
    }
}

遇到反向类的问题,比如single LL,要从尾到头的遍历

Add Two Number II

Stack 的另一个应用就是当题目所问涉及到先后的相对关系。(必须要先有a再有b之类的)

Valid Parentheses

  • 这题想到stack的原因是在右括号出现之前,一定要有对应的左括号出现,并且这个左括号必须是最近的一个
  • 在stack.pop之前,要确保stack不是空的
class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == '(' || c == '[' || c == '{') {
                stack.push(c);
            } else if (c == ')' || c == ']' || c == '}') {
                if (stack.isEmpty()) 
                    return false;
                String str = "" + stack.pop() + c;
                if (!str.equals("()") && !str.equals("[]") && !str.equals("{}")) 
                    return false;
            }
        }
        return stack.isEmpty();
    }
}

results matching ""

    No results matching ""