在海康威視的面試中,對方問了這麼一道題:
有乙個容量足夠大的棧,n個元素以一定的順序入棧,出棧順序有多少種?
比如,ab兩個元素,入棧順序為ab,出棧情況有兩種:
(1)入a,出a,入b,出b,出棧順序為ab;
(2)入a,入b,出b,出a,出棧順序為ba。
因此,2個元素時,結果為2。
分析:設f(n)為「n個元素以一定的順序入棧,出棧順序的種類數」。顯然f(1)=1,f(2)=2。我們現在來分析一般情況。一般情況下,我們可以按照「第乙個入棧的元素,在出棧序列中的位置」作為分類手段。
舉個例子,我們假設入棧元素為a,b,c,d。我們按照「a在出棧序列中的位置」分類討論:
(1)當a第乙個出棧時,a先進,然後馬上出棧。這種情況下,共有「bcd出棧順序的種類數」種方案。也就是f(n-1)。
(2)當a第二個出棧時,a先進,b再進,之後b需要馬上出來(這樣才能確保a排第二)。此時共有f(n-2)種方案。
(3)當a第三個出棧時,a先進,之後只要確保排在a後面兩個的元素比a先出即可。此時共有f(2)*f(1)種方案。f(2)是指「bc入棧出棧順序的種類數」,f(1)是指」d入棧出棧的種類數」。
分析到這裡,規律就很顯然了。
從第一項開始,分別是第乙個入棧元素在第i+1個出棧的情況數。
上式中,令f(0)=1 。
這個實際上是卡特蘭數(catalan number,又稱卡塔蘭數)。
若程式設計實現,需要維護乙個一維陣列,時間複雜度為o(n^2)。(遞迴實現的時間複雜度太高)。
卡塔蘭數的通項公式為h(n)=c(2n,n)-c(2n,n+1)(n=0,1,2,...)。
1 5入棧順序有多少種可能出棧結果
方法一 a.1個元素入棧出棧一種可能記作f 1 1 b.2個元素入棧出棧有兩種可能記f 2 2 c.3個元素入棧,考慮最後乙個元素,出棧為第乙個位置1種,第二個位置2種,第三個位置f 2 種,記作f 3 5 d.4個元素入棧,考慮最後乙個元素,出棧為第乙個位置1種,第二個位置 前面只有乙個元素pop...
N個數依次入棧,出棧順序有多少種?
對於每乙個數來說,必須進棧一次 出棧一次。我們把進棧設為狀態 1 出棧設為狀態 0 n個數的所有狀態對應n個1和n個0組成的2n位二進位制數。由於等待入棧的運算元按照1 n的順序排列 入棧的運算元b大於等於出棧的運算元a a b 因此輸出序列的總數目 由左而右掃瞄由n個1和n個0組成的2n位二進位制...
N個數依次入棧,出棧順序有多少種?
對於每乙個數來說,必須進棧一次 出棧一次。我們把進棧設為狀態 1 出棧設為狀態 0 n個數的所有狀態對應n個1和n個0組成的2n位二進位制數。由於等待入棧的運算元按照1 n的順序排列 入棧的運算元b大於等於出棧的運算元a a b 因此輸出序列的總數目 由左而右掃瞄由n個1和n個0組成的2n位二進位制...