輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如,序列 是某棧的壓棧序列,序列 是該壓棧序列對應的乙個彈出序列,但 就不可能是該壓棧序列的彈出序列。
示例 1:
輸入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]示例 2:輸出:true
解釋:我們可以按以下順序執行:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1
輸入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]輸出:false
解釋:1 不能在 2 之前彈出。
0 <= pushed.length == popped.length <= 1000思路:開闢乙個輔助棧模擬元素的入棧和出棧,遍歷入棧陣列pushed,首先元素入棧, 然後判斷棧頂和popped[i]是否相等,如果相等則出棧,並且i++,最後根據棧是否為空返回結果。0 <= pushed[i], popped[i] < 1000
pushed 是 popped 的排列。
/**
* @param pushed
* @param popped
* @return
*/var validatestacksequences = function(pushed, popped)
}return stack.length === 0;
};
時間複雜度:o(n),所有元素入棧出棧最多用2*n的時間;
空間複雜度:o(n),輔助棧的開銷。
這道題讓我想到一道有關的題目:
問:n個元素以一定順序依次入棧,有多少種出棧順序?
答:這是卡特蘭數問題,答案是 c(2n, n) - c(2n, n+1) = c(2n, n) / (n+1)。
卡特蘭數前幾項為 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, …
(注:從n=0開始)
也就是說,「1,2,3,4」入棧,出棧有14種順序;「1,2,3,4,5」入棧,出棧有42種順序。
劍指T31 棧的壓入 彈出序列
題目 輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。注意 這兩個序列的長度是相等的...
劍指offer 31 棧的壓入 彈出序列
輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。注意 這兩個序列的長度是相等的 思路...
劍指offer 31 棧的壓入 彈出序列
輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。注意 這兩個序列的長度是相等的 ...