亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++實(shí)現(xiàn)LeetCode(60.序列排序)

 更新時(shí)間:2021年07月16日 10:16:58   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(60.序列排序),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 60. Permutation Sequence 序列排序

The set [1,2,3,...,n] contains a total of n! unique permutations.

By listing and labeling all of the permutations in order, we get the following sequence for n = 3:

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"

Given n and k, return the kth permutation sequence.

Note:

  • Given n will be between 1 and 9 inclusive.
  • Given k will be between 1 and n! inclusive.

Example 1:

Input: n = 3, k = 3
Output: "213"

Example 2:

Input: n = 4, k = 9
Output: "2314"

這道題是讓求出n個(gè)數(shù)字的第k個(gè)排列組合,由于其特殊性,我們不用將所有的排列組合的情況都求出來,然后返回其第k個(gè),這里可以只求出第k個(gè)排列組合即可,那么難點(diǎn)就在于如何知道數(shù)字的排列順序,首先要知道當(dāng) n = 3 時(shí),其排列組合共有 3! = 6 種,當(dāng) n = 4 時(shí),其排列組合共有 4! = 24 種,這里就以 n = 4, k = 17 的情況來分析,所有排列組合情況如下:

1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412 <--- k = 17
3421
4123
4132
4213
4231
4312
4321

可以發(fā)現(xiàn),每一位上 1,2,3,4 分別都出現(xiàn)了6次,當(dāng)最高位上的數(shù)字確定了,第二高位每個(gè)數(shù)字都出現(xiàn)了2次,當(dāng)?shù)诙呶灰泊_定了,第三高位上的數(shù)字都只出現(xiàn)了1次,當(dāng)?shù)谌呶淮_定了,那么第四高位上的數(shù)字也只能出現(xiàn)一次,下面來看 k = 17 這種情況的每位數(shù)字如何確定,由于 k = 17 是轉(zhuǎn)化為數(shù)組下標(biāo)為 16:

最高位可取 1,2,3,4 中的一個(gè),每個(gè)數(shù)字出現(xiàn) 3!= 6 次(因?yàn)楫?dāng)最高位確定了,后面三位可以任意排列,所以是 3!,那么最高位的數(shù)字就會(huì)重復(fù) 3!次),所以 k = 16 的第一位數(shù)字的下標(biāo)為 16 / 6 = 2,在 "1234" 中即3被取出。這里的k是要求的坐標(biāo)為k的全排列序列,定義 k' 為當(dāng)最高位確定后,要求的全排序列在新范圍中的位置,同理,k'' 為當(dāng)?shù)诙邽榇_定后,所要求的全排列序列在新范圍中的位置,以此類推,下面來具體看看:

第二位此時(shí)從 1,2,4 中取一個(gè),k = 16,則此時(shí)的 k' = 16 % (3!) = 4,注意思考這里為何要取余,如果對這 24 個(gè)數(shù)以6個(gè)一組來分,那么 k=16 這個(gè)位置就是在第三組(k/6 = 2)中的第五個(gè)(k%6 = 4)數(shù)字。如下所示,而剩下的每個(gè)數(shù)字出現(xiàn) 2!= 2 次,所以第二數(shù)字的下標(biāo)為 4 / 2 = 2,在 "124" 中即4被取出。

3124
3142
3214
3241
3412 <--- k' = 4
3421

第三位此時(shí)從 1,2 中去一個(gè),k' = 4,則此時(shí)的 k'' = 4 % (2!) = 0,如下所示,而剩下的每個(gè)數(shù)字出現(xiàn) 1!= 1 次,所以第三個(gè)數(shù)字的下標(biāo)為 0 / 1 = 0,在 "12" 中即1被取出。

3412 <--- k'' = 0
3421

第四位是從2中取一個(gè),k'' = 0,則此時(shí)的 k''' = 0 % (1!) = 0,如下所示,而剩下的每個(gè)數(shù)字出現(xiàn) 0!= 1 次,所以第四個(gè)數(shù)字的下標(biāo)為 0 / 1= 0,在 "2" 中即2被取出。

3412 <--- k''' = 0

那么就可以找出規(guī)律了
a1 = k / (n - 1)!
k1 = k

a2 = k1 / (n - 2)!
k2 = k1 % (n - 2)!
...

an-1 = kn-2 / 1!
kn-1 = kn-2 % 1!

an = kn-1 / 0!
kn = kn-1 % 0!

代碼如下:

class Solution {
public:
    string getPermutation(int n, int k) {
        string res;
        string num = "123456789";
        vector<int> f(n, 1);
        for (int i = 1; i < n; ++i) f[i] = f[i - 1] * i;
        --k;
        for (int i = n; i >= 1; --i) {
            int j = k / f[i - 1];
            k %= f[i - 1];
            res.push_back(num[j]);
            num.erase(j, 1);
        }
        return res;
    }
};

到此這篇關(guān)于C++實(shí)現(xiàn)LeetCode(60.序列排序)的文章就介紹到這了,更多相關(guān)C++實(shí)現(xiàn)序列排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實(shí)現(xiàn)雙向鏈表(List)

    C++實(shí)現(xiàn)雙向鏈表(List)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)雙向鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C++Node類Cartographer開始軌跡的處理深度詳解

    C++Node類Cartographer開始軌跡的處理深度詳解

    這篇文章主要介紹了C++Node類Cartographer開始軌跡的處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-03-03
  • Matlab實(shí)現(xiàn)遺傳算法的示例詳解

    Matlab實(shí)現(xiàn)遺傳算法的示例詳解

    這篇文章主要為大家詳細(xì)介紹了什么是遺傳算法,以及如何利用Matlab從零開始自己寫一個(gè)遺傳算法函數(shù),文中的代碼對我們學(xué)習(xí)有一定幫助,需要的可以參考一下
    2022-03-03
  • C++實(shí)現(xiàn)一個(gè)簡單消息隊(duì)列的示例詳解

    C++實(shí)現(xiàn)一個(gè)簡單消息隊(duì)列的示例詳解

    消息隊(duì)列在多線程的場景有時(shí)會(huì)用到,尤其是線程通信跨線程調(diào)用的時(shí)候,就可以使用消息隊(duì)列進(jìn)行通信。本文將利用C++實(shí)現(xiàn)一個(gè)簡單的消息隊(duì)列,感興趣的可以了解一下
    2022-12-12
  • 判斷整數(shù)序列是否為二元查找樹的后序遍歷結(jié)果的解決方法

    判斷整數(shù)序列是否為二元查找樹的后序遍歷結(jié)果的解決方法

    本篇文章是對判斷整數(shù)序列是否為二元查找樹的后序遍歷結(jié)果的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • c++中的基本IO類型詳解

    c++中的基本IO類型詳解

    IO的設(shè)備可以是文件、控制臺(tái)、string。c++主要定義了三種IO類型,分別被包含在iostream、fstream、sstream頭文件中,本文給大家分享c++中的基本IO類型,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • C語言將日期、時(shí)間保存到文本文件中的方法

    C語言將日期、時(shí)間保存到文本文件中的方法

    這篇文章主要給大家介紹了關(guān)于C語言將日期、時(shí)間保存到文本文件中的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C語言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • linux c模擬ls命令詳解

    linux c模擬ls命令詳解

    本篇文章是對linux中基于c模擬ls命令的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • VisualStudio2022提交git代碼的方法實(shí)現(xiàn)

    VisualStudio2022提交git代碼的方法實(shí)現(xiàn)

    本文主要介紹了VisualStudio2022提交git代碼的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • C語言scandir函數(shù)獲取文件夾內(nèi)容的實(shí)現(xiàn)

    C語言scandir函數(shù)獲取文件夾內(nèi)容的實(shí)現(xiàn)

    scandir?函數(shù)用于列舉指定目錄下的文件列表,本文主要介紹了C語言scandir函數(shù)獲取文件夾內(nèi)容的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03

最新評論