LeetCode60:Permutation Sequence

原创 2015年07月08日 10:45:24

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.
Backtracking Math

这道题最直观的的解法就是先求出所有的排列,然后再从结果中找到第k个值即可,但是很明显会超时。

如果不能先将所有的排列都求出来,那么这道题的目的就是让我们直接找到第k个排列了。

那么如何找到第k个排列?直接要找到规律可能会比较困难,但是可以使用回溯和动态规划的一般方法,即使用用例来分析,从特殊到一般。看看通过这个特殊的用例能不能找到通用的方法,但是使用用例分析可能会由于用例选取的不全而导致遗漏一些情况,这道题做到最后就是用例选取的不全导致改了好久。

取n=3,k=5,那么输出应该是第5个排列”312”。
可以发现n=3时的所有排列中以1开头的排列有2个,以2开头的排列有2个,以3开头的排列有2个。
排列的个数取决于后面的数有多少种排列,这里后面有2个数,排列的个数是2!=2。
于是对于k=5可以这么分析
5/2=2;
5%2=1
即将[123]第0位的数字1和第2位的数字3交换,第0位就处理好了,现在数组变成[321],接着指针移到到第1位,然后将第1位到最后的元素排序,数组变成了[312],然后求[12]中的第1个数。

但是这种求解方法会有一点问题,那就是本来5和6应该都是和第2位交换,但是由于6/2=3,结果变成了第0位和第3位交换,很明显这是错误的,我们应该使用它在结果集中的下标来使用这个元素,对于k=5,实际上是第k-1=4个元素,对于4:
4/2=2;
4%2=0
它表示第0个元素要和第2个元素交换,这时第0个元素就处理好了,然后再在后面的2个元素构成的排列中查询第4%2=0个元素,当所有的元素都处理好了以后,这个数组中的元素就是我们要找的第k个排列了。

runtime:4ms

class Solution {
public:
    string getPermutation(int n, int k) {
        arr=new char[n];
        for(int i=0;i<n;i++)
            arr[i]=i+'1';
        helper(0,n,k-1);
        string str;
        for(int i=0;i<n;i++)
            str+=arr[i];
        return str;
    }
    void helper(int pos,int num,int k)
    {
        if(pos==num-1)
            return ;
        int base=k/fac(num-pos-1);
        int remain=k%fac(num-pos-1);
        sort(arr+pos,arr+num);
        swap(arr[pos],arr[pos+base]);
        helper(pos+1,num,remain);
    }

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

Leetcode #60. Permutation Sequence 排列组合序列 解题报告

1 解题思想这道题是要求第K个全排列组合的序列,什么意思呢,对于一个1…n的数字,我们一共会有n!个排列组合的序列,那么我们现在按照字典序为顺序,要求给出第K个序列。传统的做法呢,是使用字典序的方式进...
  • MebiuW
  • MebiuW
  • 2016年04月30日 23:06
  • 901

LeetCode 60. Permutation Sequence(排列序列)

原题网址:https://leetcode.com/problems/permutation-sequence/ The set [1,2,3,…,n] contains a total o...
  • jmspan
  • jmspan
  • 2016年05月21日 09:05
  • 314

【leetcode】【60】Permutation Sequence

一、问题描述 The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labe...
  • xiaoliucool1314
  • xiaoliucool1314
  • 2016年03月02日 09:21
  • 429

LeetCode-60-Permutation Sequence(找规律)-Medium

题意理解: 将0-n按照从小到大的顺序进行全排序,求解第k个排列结果 题目分析: 穷举会超时,找规律, 1)第k个排列的第一个元素在0-n中的位置为(k-1)/(n-1)! 2)在剩...
  • eddy_liu
  • eddy_liu
  • 2016年03月04日 09:07
  • 1375

LeetCode 60 Permutation Sequence (Python实现及详解)

【题目】   The set [1,2,3,…,n] contains a total of n! uniquepermutations.   By listing and labeling ...
  • yangjingjing9
  • yangjingjing9
  • 2017年08月01日 16:23
  • 217

LeetCode 60

Permutation Sequence     这个题是求1~n (n[1~9]) 的数字的全排列的第K个序列。     一般思路是:使用一个计数器,递归去找全排列序列,找到一个计数器加一,一直到...
  • zr1076311296
  • zr1076311296
  • 2016年06月04日 14:16
  • 1600

LeetCode60:Permutation Sequence

The set [1,2,3,…,n] contains a total of n! unique permutations.By listing and labeling all of the pe...
  • u012501459
  • u012501459
  • 2015年07月08日 10:45
  • 619

leetcode 60. Permutation Sequence

康托公式 全排列
  • chengyu779394084
  • chengyu779394084
  • 2016年04月29日 23:03
  • 539

(Java)LeetCode-60. Permutation Sequence

The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of ...
  • u012848330
  • u012848330
  • 2016年10月05日 23:52
  • 294

LeetCode60——Permutation Sequence

LeetCode60——Permutation Sequence 又是全排列的问题。 循环调用next_permutation()这个方法测试过超时。 这个题参考了:http://blog.cs...
  • zhangxiao93
  • zhangxiao93
  • 2015年10月24日 22:38
  • 464
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LeetCode60:Permutation Sequence
举报原因:
原因补充:

(最多只允许输入30个字)