less than 1 minute read

<-M 60> Permutation Sequence

// Method 1
class Solution {
public:
    string getPermutation(int n, int k) {
        string s(n, '0');
        string ans;
        for(int i = 0; i < n; i++) {
            s[i] += i + 1;
        }
        return kthPermutation(s, k);
    }

private:
    int factorial(int n) {
        int result = 1;
        for(int i = 1; i <= n; i++) {
            result *= i;
        }
        return result;
    }

    string kthPermutation(string seq, int k) {
        const int n = seq.size();
        string ans;

        int base = factorial(n - 1);
        --k;

        for(int i = n - 1; i > 0; k %= base, base /= i, i--) {
            auto index = next(seq.begin(), k / base);
            ans.push_back(*index);
            seq.erase(index);
        }
        ans.push_back(seq[0]);
        return ans;
    }
};

// Method 2
class Solution {
public:
    string getPermutation(int n, int k) {

        int fact =  1;
        vector<int> nums;
        for(int i = 1; i < n; i++) {
            fact = fact * i;
            nums.push_back(i);
        }

        nums.push_back(n);
        string result = "";
        k = k - 1;
        while(true) {
            result.push_back(nums[k / fact] + '0');
            nums.erase(nums.begin() + k / fact);

            if(nums.size() == 0)
                break;
            k = k % fact;
            fact = fact / nums.size();
        }

        return result;
    }
};