• [LeetCode]Permutation Sequence


    题目描述:(链接)

    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.

    解题思路:

    按照上一题的思路,暴力破解,超时了,k可以超过n!,冏!代码如下,代码折叠,别打开:

    class Solution {
    public:
        string getPermutation(int n, int k) {
            string result(n, '0');
            for (size_t i = 0; i < result.size(); ++i) {
                result[i] += i + 1;
            }
            
            for (size_t i = 0; i < k; ++i) {
                nextPermutation(result);
            }
            
            return result;
        }
        
        void nextPermutation(string& str) {
            int i;
            int j;
            // From right to left, find the first item(PartitionNumber) which violates the increase trend
            for (i = str.size() - 2; i >= 0; --i) {
                if (str[i] < str[i + 1]) break;
            }
            
            // From right to left, find the first item(ChangeNumber) which is larger than PartitionNumber
            for (j  = str.size(); j >= i; --j) {
                if (str[j] > str[i]) break;
            }
            
            // swap PartitionNumber and ChangeNumber
            if (i >= 0) {
                swap(str[i], str[j]);
            }
            
            // reverse all after PartitionNumber index
            reverse(str.begin() + i + 1, str.end());
        }
    };
    

    转载:http://www.cnblogs.com/tenosdoit/p/3721918.html

    有没有什么方法不是逐个求,而是直接构造出第k个排列呢?我们以n = 4,k = 17为例,数组src = [1,2,3,...,n]。

    第17个排列的第一个数是什么呢:我们知道以某个数固定开头的排列个数 = (n-1)! = 3! = 6, 即以1和2开头的排列总共6*2 = 12个,12 < 17, 因此第17个排列的第一个数不可能是1或者2,6*3 > 17, 因此第17个排列的第一个数是3。即第17个排列的第一个数是原数组(原数组递增有序)的第m = upper(17/6) = 3(upper表示向上取整)个数。    

     1 class Solution {
     2 public:
     3     string getPermutation(int n, int k) {
     4         int total = factorial(n);
     5         string candidate = string("123456789").substr(0, n);
     6         string result(n, '0');
     7         for (int i =0; i < n; ++i) {
     8             total /= (n - i);
     9             int index = (k - 1) / total;
    10             result[i] = candidate[index];
    11             candidate.erase(index, 1);
    12             k -= index * total;
    13         }
    14         
    15         return result;
    16     }
    17 private:
    18     int factorial(int n) {
    19        int result = 1;
    20        for (int i = 2; i <= n; ++i) {
    21            result *= i;
    22        }
    23        
    24        return result;
    25     }
    26 };

          

  • 相关阅读:
    vs2010下载
    .Net执行cmd命令
    本Blog链接交换
    DNN 04.09.01 StartKit中的新内容。
    如何使一个你没有源代码的DLL文件变为强命名的(Strong Name)
    "Error Creating Control" when creating a custom control
    GridView导出为Excel后,导出的.xls文件无法作为源文件导入的问题
    DotNetNuke的C#版本
    DotNetNuke 5.0 放到CodePlex上提供下载了
    在VS中使用独立的项目(Project)开发DNN模块
  • 原文地址:https://www.cnblogs.com/skycore/p/4858753.html
Copyright © 2020-2023  润新知