zoukankan      html  css  js  c++  java
  • [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: }


  • 相关阅读:
    【转自百度贴吧】把古诗最后三个字改为“日了狗”,看谁最有才!
    计划!
    [BZOJ2424][HAOI2010]订货
    [BZOJ1026][SCOI2009]windy数
    【作文】高考之外
    [AYYZVijos1761]运输问题
    [BZOJ1047][HAOI2007]理想的正方形
    [NOIP2015]代码
    新的独立博客
    不忘初心,方得始终——NOIP2016前的感悟
  • 原文地址:https://www.cnblogs.com/codingtmd/p/5078875.html
Copyright © 2011-2022 走看看