LeetCode 60 第k個排列

2021-09-29 15:22:28 字數 1144 閱讀 8916

給出集合 [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 = 3

輸出: 「213」

示例 2:

輸入: n = 4, k = 9

輸出: 「2314」

由於以前做過 leetcode 31 下乙個排序,所以首先想到直接呼叫此函式k次,就可以生成第k個排序。但是似乎有點滿。考慮數學方法,假如有n個數,那麼第乙個數是(0,n)之間任意數的概率都是n!/n,即(n-1)!,

用(k-1)/(n-1)!得到的結果即是當前需要的插入的數字在備選區的位置。

處理後將當前數移除備選區,依次以相同方法處理第二位至最後一位即可。

class

solution

for(

int i =

0; i < k -

1; i++

)return res;

} string nextpermutation

(string s)}if

(k ==-1

)for

(int i = len -

1; i >=

0; i--)}

swap

(s[k]

, s[l]);

reverse

(s.begin()

+ k +

1, s.

end())

;return s;}}

;

class

solution

for(

int i =

0; i < n; i++

)return res;

}int

helper

(int x)

else}}

;

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個排列

題目鏈結 題解 逆康托展開。考慮康托展開的過程。k v i n i 其中v i 表示在a i 1.n 中比a i 小的數字的個數 也即未出現的數字中它排名第幾 從0開始 那麼我們在逆康托展開的時候,就可以通過直接除 n i 得到每個數字的v i 的值。然後通過給已經出現的數字打tag。剩下的問題就轉...