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 (ie, for n = 3):

“123”
“132”
“213”
“231”
“312”
“321”
Given n and k, return the kth permutation sequence.

Note: Given n will be between 1 and 9 inclusive.

这道题是要得到第k个全排列, n个数的permutation总共有n阶乘个,基于这个性质我们可以得到某一位对应的数字是哪一个。思路是这样的,比如当前长度是n,我们知道每个相同的起始元素对应(n-1)!个permutation,也就是(n-1)!个permutation后会换一个起始元素。因此,只要当前的k进行(n-1)!取余,得到的数字就是当前剩余数组的index,如此就可以得到对应的元素。

代码如下:

public class Solution 
{
    /*
     * n个数的permutation总共有n阶乘个,基于这个性质我们可以得到某一位对应的数字是哪一个。
     * 思路是这样的,比如当前长度是n,我们知道每个相同的起始元素对应(n-1)!个permutation,
     * 也就是(n-1)!个permutation后会换一个起始元素。因此,只要当前的k进行(n-1)!取余,
     * 得到的数字就是当前剩余数组的index,如此就可以得到对应的元素。
     * */
    public String getPermutation(int n, int k)
    {
        StringBuilder list=new StringBuilder();
        for(int i=1;i<=n;i++)
            list.append(i+"");

        StringBuilder res=new StringBuilder();
        int factor=getFactor(n);
        for(int i=n;i>=1;i--)
        {
            factor=factor/i;
            int index=(k-1)/factor ;  //第k个,k是从1开始的,所以要减一,从0开始
            res.append(list.charAt(index));
            list.deleteCharAt(index);
            k=k-index*factor;
        }
        return res.toString();
    }

    public int getFactor(int n)
    {
        int sum=1;
        for(int i=1;i<=n;i++)
            sum*=i;
        return sum;
    }
}

下面是C++的做法,我是网上参考的答案,有点搞不懂

代码如下:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

class Solution 
{
public:
    string getPermutation(int n, int k) 
    {
        string list = "";
        for (int i = 1; i <= n; i++)
            list += to_string(i);

        string res;
        int factor = getFector(n);
        for (int i = n; i >= 1; i--)
        {
            factor = factor / i;
            int index = (k - 1) / factor;
            res += list[index];
            k = k - index*factor;
            list.erase(list.begin()+index);
        }
        return res;
    }

    int getFector(int n)
    {
        int product = 1;
        for (int i = 1; i <= n; i++)
            product *= i;
        return product;
    }
};

我的建议是直接使用C++的next_permutation函数

#include <iostream>
#include <vector>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <stack>
#include <string>
#include <climits>
#include <algorithm>
#include <sstream>
#include <functional>
#include <bitset>
#include <numeric>
#include <cmath>
#include <regex>

using namespace std;



class Solution 
{
public:
    string getPermutation(int n, int k) 
    {
        string res = "";
        for (int i = 1; i <= n; i++)
            res += to_string(i);

        int i = 1;
        while (i<k && next_permutation(res.begin(), res.end()))
            i++;

        return res;
    }
};