LeetCode60 第k個排列

2022-08-11 09:33:10 字數 1288 閱讀 2716

解法一:用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 ...