LeetCode--Permutation Sequence

来源:互联网 发布:淘宝店怎么打造爆款 编辑:程序博客网 时间:2024/06/16 03:32

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.

思路:暴力搜索法。
之前写过一个nextPermutation的题目,这里可以直接调用k-1次即可,甚至可以直接调用C++中STL自带的函数next_permutation(s.begin(),s.end()).
还有一种效率更高的康托编码,很神奇,可以直接找到答案,不用搜索所有情况。

class Solution {public:    string getPermutation(int n, int k) {        string s(n,'0');        for(int i=0;i<n;i++)            s[i]+=i+1;        for(int i=0;i<k-1;i++)            nextPermutation(s);        return s;    }     void nextPermutation(string &nums) {        int k=-1,n=nums.size();        for(int i=n-2;i>=0;i--){            if(nums[i]<nums[i+1]){                k=i;                break;            }        }        if(k==-1){            reverse(nums.begin(),nums.end());            return;        }        int l=-1;        for(int i=n-1;i>k;i--){            if(nums[i]>nums[k]){                l=i;                break;            }        }        swap(nums[k],nums[l]);        reverse(nums.begin()+k+1,nums.end());    }};

这里写图片描述

class Solution {public:    string getPermutation(int n, int k) {        string s(n,'0');        string result;        for(int i=0;i<n;i++)            s[i]+=i+1;        return kth_permutation(s,k);    }private:    int factorial(int n)    {        int result=1;        for(int i=1;i<=n;i++)        {            result*=i;        }        return result;    }    string kth_permutation(string seq,int k)    {        int n=seq.size();        string S=seq;        string result;        int base=factorial(n-1);        k--;        for(int i=n-1;i>0;k%=base,base/=i,i--)        {            result.push_back(S[k/base]);            string::iterator a=S.begin()+k/base;            S.erase(a);        }        result.push_back(S[0]);        return result;    }};
原创粉丝点击