LeetCode - Permutation Sequnce 题解

来源:互联网 发布:七日杀小人物模型数据 编辑:程序博客网 时间:2024/06/10 04:15

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.

分析:

可以一个一个找next permulation 不过会超时

class Solution {private:    void getBigger(vector<int> &numbers){        int pos = numbers.size() - 1;        while(numbers[pos - 1] > numbers[pos])            pos--;        pos--;        int xpos = numbers.size() - 1;        while(numbers[xpos] < numbers[pos])            xpos--;        int x = numbers[xpos];        int t = numbers[pos];        numbers[pos] = numbers[xpos];        numbers[xpos] = t;        int i = pos + 1, j = numbers.size() - 1;        while(i < j){            t = numbers[i];            numbers[i] = numbers[j];            numbers[j] = t;            i ++;            j --;        }    }public:    string getPermutation(int n, int k) {        vector<int> numbers(n);        for(int i = 1; i <= n; i++){            numbers[i - 1] = i;        }        for(int i = 1; i < k; i++)            getBigger(numbers);//,printVector<int>(numbers);        string ans;        for(auto x : numbers){            char ch[25];            sprintf(ch,"%d",x);            ans += string(ch);        }        return ans;    }};


还可以直接算出来,比如5的排列中,前4! 个排列一定是1开头的,第二个4! 排列中一定是2开头的,依此类推。


class Solution {private:    int getJieCheng(int m){        int ans = 1;        for(int i = 1; i <= m;i ++){            ans *= i;        }        return ans;    }public:    string getPermutation(int n, int k) {        vector<int> numbers;        for(int i = 1; i <= n; i++)            numbers.push_back(i);        string ans;        for(int m = n - 1; m >= 0; m--){            int l = getJieCheng(m);            int i = 0;            while(k > l){                k -= l;                i++;            }            char ch[10];            sprintf(ch, "%d", numbers[i]);            ans += string(ch);            numbers.erase(numbers.begin() + i);        }        return ans;    }};







0 0
原创粉丝点击