1. 程式人生 > 資訊 >餘額寶第一名存了 2.2 億,一天收益上萬元

餘額寶第一名存了 2.2 億,一天收益上萬元

劍指 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 的排列。

做題思路:

這道題主要是藉助輔助棧彈出序列索引,然後和彈出的的popped相互比較,相等的話,則彈出序列,不相等則繼續遍歷,直到把所有輔助棧的序列彈出,即可輸出true。但如果index==push.length的時候,就直接輸出false。

class Solution {
    Stack<Integer> stack = new Stack<>();
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        int index = -1;
        for (int i = 0; i < popped.length; i++) {
            while(stack.isEmpty()||stack.peek()!=popped[i]){
                index++;
                if(index==pushed.length){
                    return false;
                }
                stack.push(pushed[index]);
            }
            stack.pop();
        }
        return true;
    }
}

這是k神更為簡潔的程式碼思路,強烈推薦好好學習借鑑下。

演算法流程:

  1. 初始化: 輔助棧 stackstack ,彈出序列的索引 ii ;
  2. 遍歷壓棧序列: 各元素記為 numnum ;
    1. 元素 numnum 入棧;
    2. 迴圈出棧:若 stack 的棧頂元素 == 彈出序列元素 popped[i] ,則執行出棧與 i++;
  3. 返回值: 若 stack為空,則此彈出序列合法。
class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        Stack<Integer> stack = new Stack<>();
        int i = 0;
        for(int num : pushed) {
            stack.push(num); // num 入棧
            while(!stack.isEmpty() && stack.peek() == popped[i]) { // 迴圈判斷與出棧
                stack.pop();
                i++;
            }
        }
        return stack.isEmpty();
    }
}

參考連結:

https://leetcode-cn.com/problems/zhan-de-ya-ru-dan-chu-xu-lie-lcof/solution/mian-shi-ti-31-zhan-de-ya-ru-dan-chu-xu-lie-mo-n-2/