• [LeetCode] Permutation Sequence, Solution



    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.
    » Solve this problem

    [Thoughts]
    两个解法。
    第一,DFS
    递归遍历所有可能,然后累加计算,直至到K为止。

    第二,数学解法。

    假设有n个元素,第K个permutation是
    a1, a2, a3, .....   ..., an
    那么a1是哪一个数字呢?

    那么这里,我们把a1去掉,那么剩下的permutation为
    a2, a3, .... .... an, 共计n-1个元素。 n-1个元素共有(n-1)!组排列,那么这里就可以知道

    设变量K1 = K
    a1 = K1 / (n-1)!

    同理,a2的值可以推导为
    a2 = K2 / (n-2)!
    K2 = K1 % (n-1)!
     .......
    a(n-1) = K(n-1) / 1!
    K(n-1) = K(n-2) /2!

    an = K(n-1)

    实现如下:
    1:       string getPermutation(int n, int k) {  
    2: vector<int> nums(n);
    3: int permCount =1;
    4: for(int i =0; i< n; i++)
    5: {
    6: nums[i] = i+1;
    7: permCount *= (i+1);
    8: }
    9: // change K from (1,n) to (0, n-1) to accord to index
    10: k--;
    11: string targetNum;
    12: for(int i =0; i< n; i++)
    13: {
    14: permCount = permCount/ (n-i);
    15: int choosed = k / permCount;
    16: targetNum.push_back(nums[choosed] + '0');
    17: //restruct nums since one num has been picked
    18: for(int j =choosed; j< n-i; j++)
    19: {
    20: nums[j]=nums[j+1];
    21: }
    22: k = k%permCount;
    23: }
    24: return targetNum;
    25: }


  • 相关阅读:
    HDU 2602
    ZOJ 1074 最大子矩阵和
    POJ 3903
    最大子段和
    HDU 1052
    CodeForces 18C
    CodeForces 546B-Soldier and Badges
    UVA 11462-Age sort
    Codeforces Round #326 (Div. 2)-Duff in Love
    Codeforces Round #327 (Div. 2)-Wizards' Duel
  • 原文地址:https://www.cnblogs.com/codingtmd/p/5078875.html
Copyright © 2020-2023  润新知