筆試演算法題 買票找零問題,及引申的遞迴問題

2021-08-18 11:07:08 字數 1944 閱讀 4544

關鍵是要理解下文所說的,要求,0的累加個數大於1的累加個數.他們是一一對應的關係,從左到右掃瞄對應。

來自部落格:

問題描述:

12個高矮不同的人,排成兩排,每排必須是從矮到高排列,而且第二排比對應的第一排的人高,問排列方式有多少種?

這個筆試題,很yd,因為把某個遞迴關係隱藏得很深.

問題轉換為,這樣的滿足條件的01序列有多少個.

觀察1的出現,我們考慮這乙個出現能不能放在第二排,顯然,在這個1之前出現的那些0,1對應的人

要麼是在這個1左邊,要麼是在這個1前面.而肯定要有乙個0的,在這個1前面,統計在這個1之前的0和1的個數.

也就是要求,0的個數大於1的個數.

對於每個1,1前面的0的個數,要大於1的個數,關係才成立。因為,對應的後面的數要比前面的數大,0比1多,可以滿足出現乙個1,就去對應他前面的0,這樣肯定是後面的數比前面的數大了。

在《計算機程式設計藝術》,第三版,donald e.knuth著,蘇運霖譯,第一卷,508頁,給出了證明:

問題大意是用s表示入棧,x表示出棧,那麼合法的序列有多少個(s的個數為n)

顯然有c(2n, n)個含s,x各n個的序列,剩下的是計算不允許的序列數(它包含正確個數的s和x,但是違背其它條件).

部落格:問題等價於:n個1和n個0組成一2n位的2進製數,要求從左到右掃瞄,1的累計數不小於0的累計數,試求滿足這條件的數有多少?

解答: 設p2n為這樣所得的數的個數。在2n位上填入n個1的方案數為 c(n 2n)

不填1的其餘n位自動填以數0。從c(n 2n)中減去不符合要求的方案數即為所求。

不合要求的數指的是從左而右掃瞄,出現0的累計數超過1的累計數的數。

不合要求的數的特徵是從左而右掃瞄時,必然在某一奇數2m+1位上首先出現m+1個0的累計數,和m個1的累計數。

此 後的2(n-m)-1位上有n-m個1,n-m-1個0。如若把後面這部分2(n-m)-1位,0與1交換,使之成為n-m個0,n-m-1個1,結果得 1個由n+1個0和n-1個1組成的2n位數,即乙個不合要求的數對應於乙個由n-1個1和n+1個0組成的乙個排列。

反過來,任何乙個 由n+1個0,n-1個1組成的2n位數,由於0的個數多2個,2n是偶數,故必在某乙個奇數字上出現0的累計數超過1的累計數。同樣在後面的部分,令0 和1互換,使之成為由n個0和n個1組成的2n位數。即n+1個0和n-1個1組成的2n位數,必對應於乙個不合要求的數。

用上述方法建立了由n+1個0和n-1個1組成的2n位數,與由n個0和n個1組成的2n位數中從左向右掃瞄出現0的累計數超過1的累計數的數一一對應。

不合要求的2n位數與n+1個0,n-1個1組成的排列一一對應

因此,序列的個數是c(2n, n-1),因此an = c(2n, n) - c(2n, n-1)

leetcode上題目的解法:

print('此處分割線————————————————————————————————————————』)

2.2漢諾塔問題

見知乎

參考部落格

解析:在f和s之間迴圈,當i==j時,退出迴圈。

買票找零問題

問題描述 一場激烈足球賽即將開始,售票員緊張地賣票著 每張球票50元,現在有2n 1 n 18 個球迷排隊購票,其中n個手持50元鈔票,另外n個手持100元鈔票。假設開始售票時售票處沒有零錢可以找零。問這2n個人有多少種排隊方式,不至使售票處出現找不出零的局面?例如當n 3時,共6人,3人持50元,...

4 3 買票找零問題

answer res c n c fracc n 先介紹卡特蘭數 給出乙個n,要求乙個長度為2n的0,1序列,使得序列的任意字首中1的個數不少於0的個數 證明 考慮乙個含有n個1,n個0的2n位二進位制數字,掃瞄到第2m 1位上的時候有m 1個0和m個1,則後面0,1 的個數分別為 有n m個1和n...

鏈家筆試演算法題

1 給定乙個陣列,將奇數排在偶數前面 思路 類似於快排的思想 include include include using namespace std void exchange int a,int n 2 刪除有序鍊錶中的重複元素 如下 include include include using n...