每日算法之四十二:Permutation Sequence (顺序排列第k个序列)

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):

  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.

第一位每个数字开头的序列都有(n-1)!个序列,因此n个数字所以共有n!个序列。
 
以此类推,第二位每一个数开头都有(n-2)!个序列。
 
因为数字不能重复,我用sign记录数字是否使用过,data存阶层的值。
 
每次循环找到没使用过的数中第k/data[i]个数就是当前位的数字。(这就是中间带有break的循环的原因)
对于这种不好确定次序的情况,应该举例说明,这样就能很清楚的看明白是否应该多加一个或者少减一个。

class Solution {
public:
    string getPermutation(int n, int k) {
        int data[10];
        vector<bool> visited(10,0);
        data[0]=1;
        for(int i=1;i<=n;i++)
        {
            data[i]=data[i-1]*i;
        }
        string str(n,'0');
        --k;            //从0位开始算起,例如,从1开始算的第5个,也就是从0开始算的第四个
        for(int i=n-1;i>=0;i--)
        {
            int temp_k=k/data[i];
            int j=1;
            for(;j<10;j++)
            {
                if(visited[j]==0)
                    temp_k--;
                if(temp_k<0)
                    break;
            }
            visited[j]=1;
            str[n-i-1]='0'+j;
            k=k%data[i];
        }
        return str;
    }
};





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值