解法一:用next_permutation()函式,要求第k個排列,就從"123...n"開始呼叫 k - 1 次 next_permutation()函式即可。
class solution
for(int i = 0; i < k - 1; ++i)
return res;}};
解法二:
計數,計算第k個排列各個位的數字。
比如 n = 4, k = 10。 假設我們確定了第0位(最高位)的數字,那麼剩下三位有三種排列,即剩下(n - 1)! = 3! = 6種排列。
因此如果第 0 位填1,那麼當前的排列範圍為第1個排列到第6個排列,6 < 10,因此第乙個數字不填1。
那麼再假設第 0 位填2,這裡顯然跨過了第 0 位填 1 的6個排列,因此 k - (n - 1)! = 10 - 3 ! = 4,
又由於第 0 位填2的排列也有 3! = 6個,6 > 4,
因此我們可以確定第 10 個排列的第 0 位(第乙個數字)填2。
然後就是要確定第 1 位(第二個數字),依舊是從小到大列舉:
假設第 1 位填 1,那麼剩下沒填的位數有兩位,剩下的排列數就是 2! = 2, 2 < k (k現在是4)
因此第 1 位 不是填1 ,跳過第 1 位填 1 的所有排列, k 再更新一下:k -= 2! , 現在 k 的值是 2。
那再假設第 1 位填 3 (由於2已經用過了,所以跳過 2),第 0 位 填 2、第 1 位填 3 的排列數為 2, 2 >= k,
所以我們可以確定第 1 位 填3。
現在列舉第 2 位(第三個數字)的情況,假設第 2 位填1,剩下只剩一位沒填,排列數為 1, 1 < k (k的值是2)
所以跳過第 2 位為 1 的排列,更新k : k -= 1! , k現在為1,
由於2,3都已經用過了,所以跳過,假設第 2 位 填 4: 剩下的排列數為1, 1 >= k,
因此我們得到第 2 位數字為 4.
這樣第 3 位(第四個數字,即最後乙個)只能填 我們還沒有填的1.
所以我們知道了當 n 為 4 時,第10個排列的數字為 "2341"
根據上面的思路,得到如下**:
class solution
for(int j = 1; j<= n; ++j) else }}
}return res;}};
LeetCode60 第k個排列
給出集合 1,2,3,n 其所有元素共有 n 種排列。按大小順序列出所有排列情況,並一一標記,當 n 3 時,所有排列如下 123 132 213 231 312 321 給定 n 和 k,返回第 k 個排列。說明 示例 1 輸入 n 3,k 3輸出 213 示例 2 輸入 n 4,k 9輸出 23...
leetcode 60 第k個排列
給出集合 1,2,3,n 其所有元素共有 n 種排列。按大小順序列出所有排列情況,並一一標記,當 n 3 時,所有排列如下 123 132 213 231 312 321 給定 n 和 k,返回第 k 個排列。說明 給定 n 的範圍是 1,9 給定 k 的範圍是 1,n 示例 1 輸入 n 3,k ...
LeetCode 60 第k個排列
給出集合 1,2,3,n 其所有元素共有 n 種排列。按大小順序列出所有排列情況,並一一標記,當 n 3 時,所有排列如下 123 132 213 231 312 321 給定 n 和 k,返回第 k 個排列。說明 給定 n 的範圍是 1,9 給定 k 的範圍是 1,n 示例 1 輸入 n 3,k ...