有n個人首先站成一排,請問,當n個人第二次再重新排列,每個人都不在原來的位置上,問有多少種站法。例如,原來有3個人,abc,那麼第二次每個人都不在原來的位置上有2種站法,bca和cab,這題其實是一道數學題,考察排列組合的知識。
解題思路:假設有n個人,我們的問題規模設為a(n),a(n)代表n個人都不在原來的位置上一共有多少種站法。令第1個人站在非1號位置,一共有n-1種站法,假設第1個人站在2號位置,那麼第2個人的站的位置分2類:第一類是第2個人站在1號位置,這樣第1個人和第2個人的位置都確定了,那麼剩下n-2個位置,問題規模變成了a(n-2),相當於第3個人不站在3號位置,第4個人不站在4號位置.....第n個人不站在n號位置,第二類是第2個人不是站在1號位置,那麼問題的規模又變成了a(n-1),相當於第2個人不站在1號位置,第3個人不站在3號位置,第4個人不站在4號位置......第n個人不站在n號位置。所以a(n) = (n-1) * ( a(n-1) + a(n-2) ),這樣解題的思路就清晰了,只需要定義乙個陣列arr[n + 1],首先儲存arr[1] = 0,arr[2] = 1,從arr[3]開始,迭代計算 arr[i] = (i - 1) * (arr[i - 1] + arr[i - 2]),最後返回arr[n]就行了,也可以定義三個變數分別儲存arr[1],arr[2],arr[3],然後交替賦值,這樣能節省空間。為了清晰,我還是以定義陣列來演示程式。
/*** n個人原來站成一排,重新再排一次,要求每個人都不能
* 站在原來的位置,求有多少種站法。
* @param
n
*/public
static
int fun(int
n)
return
arr[n];
}
N個人都不坐自己位置的情況有幾種
問題描述 n個人每個人都有自己的位置,問每個人都不坐自己的位置有幾種情況 思路很簡單 遞迴 第乙個人可以做其他n 1個位置,當第乙個人做每乙個位置,比如說第乙個人坐2號位置和3號位置的情況是一樣多的。然後當第乙個人坐2號位置,剩下的情況和原問題並不等價 因為原問題每個人都有自己的位置,但是現在子問題...
leetcode 319 N個人開關N盞燈
初始時有 n 個燈泡關閉。第 1 輪,你開啟所有的燈泡。第 2 輪,每兩個燈泡你關閉一次。第 3 輪,每三個燈泡切換一次開關 如果關閉則開啟,如果開啟則關閉 第 i 輪,每 i 個燈泡切換一次開關。對於第 n 輪,你只切換最後乙個燈泡的開關。找出 n 輪後有多少個亮著的燈泡。示例 輸入 3輸出 1解...
排隊 白雪公主與n個小矮人
問題描述 在七山七海之外的乙個小村莊,白雪公主與n個矮人住在一起,所有時間都花在吃和玩league of legend遊戲。白雪公主決心終結這樣的生活,所以為他們舉辦了體育課。在每節課開始時,矮人必須按他們的身高站隊。假定矮人們有高度1,2,n 每個人高度互不相同 然而,由於不健康的生活方式,矮人的...