前往
大廳
主題

LeetCode - 0526. Beautiful Arrangement 解題心得

Not In My Back Yard | 2024-05-17 12:00:08 | 巴幣 0 | 人氣 23

題目連結:


題目意譯:
假設你有編號為 1 到 n 的 n 個整數。這 n 個整數的一個排列 perm(索引值從 1 開始數)如果對於每一個 i 值(1 ≦ i ≦ n)滿足以下條件之一,則該排列將會被視為是一個美麗的排法:
    perm[i] 可以被 i 整除;
    i 可以被 perm[i] 整除。

給定一個整數 n,回傳你可以建造出來的美麗排法之數量。

限制:
1 ≦ n ≦ 15



範例測資:
範例 1:
輸入: n = 2
輸出: 2
解釋:
第一個美麗排法為 [1,2]:
    - perm[1] = 1 可以被 i = 1 整除
    - perm[2] = 2 可以被 i = 2 整除
第二個美麗排法為 [2,1]:
    - perm[1] = 2 可以被 i = 1 整除
    - i = 2 可以被 perm[2] = 1 整除

範例 2:
輸入: n = 1
輸出: 1


解題思維:
據透:n == 15 的答案為 24679。

所以可以看到我們可以直接進行遞迴的方式來窮舉所有可能的方式。當然,如果「直接暴力」窮舉的話,所有可能的排列為 n!。而 n 最大為 15,因此最糟是需要跑過 15! = 1307674368000 種組合,而這很明顯是不可能在合理時間內跑完的。

因此在遞迴窮舉的時候,假設現在要位置 i 放數字 j,如果 i 除以 j 不能整除而 j 除以 i 也同樣不能整除的話,這個就沒有必要繼續遞迴窮舉下去了。這樣做會省下很多時間。



當然,我們也可以在本地端把所有可能的答案求出來直接填入一個陣列來查表即可(畢竟有時候不是所有題目都像是本題這樣答案相對地小)。而以下是 n = 1 ~ 15 各自的答案:
1、
2、
3、
8、
10、
36、
41、
132、
250、
700、
750、
4010、
4237、
10680、
24679。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作