60. Permutation Sequence

来源:互联网 发布:微水试验数据 编辑:程序博客网 时间:2024/06/07 08:14

1、题目描述

输入整数n和k,返回第k个n的全排列。


2、思路

可以用递归的思路。先确定第一个数字是多少,再依次确定剩下的n-1个数字。

k先减1,换成0 base的。声明由1-n组成的数组v。

设n-1个数的全排列总数为num,则(k/num)可以确定第k个全排列在第几组,也就是第一个数应该是v的第(k/num)个元素;

(k%num)是新的k,v是排除了之前的元素形成的新数组;

依次类推求出后面的每一位数字。结束递归的的条件是v中只剩一个元素,则把这个元素加在最后即可。


3、代码

string getPermutation(int n, int k) {        vector<int>v;        for(int i=1;i<=n;i++)            v.push_back(i);        return getans(v,k-1);    }    string getans(vector<int>v,int k){        int n = v.size();        if(n==1) {            char c = char(v[0]+'0');            string s="";            s+=c;                        return s;        }        int num = 1;        for(int i=1;i<n;i++)            num*=i;        int a = k / num;//di a zu        int b = k % num;//di b ge        char c= v[a]+'0';        vector<int>v1;        for(int i=0;i<n;i++){            if(i!=a)                v1.push_back(v[i]);        }        string ans = c +getans(v1,b);        return ans;    }