LeetCode 60 - Permutation Sequence
題目
題目連結:https://leetcode.com/problems/permutation-sequence/
給定 n
, k
兩數字,求 n! 排列中的第 k 項。
範例說明
Example 1:
1 | Input: n = 3, k = 3 |
Example 2:
1 | Input: n = 4, k = 9 |
Example 3:
1 | Input: n = 3, k = 1 |
想法
把 4! 的排列列出來,如下:
1 | 1 2 3 4 |
我們可以輕易的發現,第一個數字是很好求得的,即第 1 ~ 6 個即為 1,第 7 ~ 12 個即為 2,第 13 ~ 18 個即為 3,第 19 ~ 24 個即為 4。
可以發現,在第一個數字決定後,後面三個數字的排列其實跟一般的 3! 排列是一樣的,可以觀察到第一個數字是 4 個六種排列,後三個數字剛好就是 1, 2, 3 的 3! 排列:
1 | 4 1 2 3 |
那第一個數字不是 4 的六種排列呢?其實也是一樣的,只是要將數字替換而已,例如第一個數字是 2 的排列:
1 | 2 1 3 4 |
其實可以發現後面的數字即是 1, 3, 4 的 3! 排列。
所以要決定第二個數字,我們只需要算出第 k 個排列在第二個數字時變成第幾個排列即可。
可以發現 k = 1 ~ 6
的在第二個數字時也是對應到 k = 1 ~ 6
,
k = 7 ~ 12
在第二個數字也是對應到 k = 1 ~ 6
,
k = 13 ~ 18
在第二個數字也是對應到 k = 1 ~ 6
,
k = 19 ~ 24
在第二個數字也是對應到 k = 1 ~ 6
。
因此 k 在第二層時即變成 (k - 1) % 6 + 1
。
知道方法決定第一個數字以及第二個數字之後,第三、四個數字的決定方法即可以用一樣的想法求出。
實作細節
求第一個數字時,第一個數字是 1 個應該有 (n - 1)!
個,是 2 的也有 (n - 1)!
個…,
因此,第一個數字應該是 (k - 1) / (n - 1)!
小的還沒使用過的數字。
求第二個數字時,此時 k 變成了 (k - 1) % (n - 1) + 1
,
因此,第二個數字應該是 (k - 1) / (n - 2)!
小的還沒使用過的數字。
以此類推直到 n 個數字都求完即可。
程式碼
1 | /** |