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;
};

LeetCode60:Permutation Sequence的更多相关文章

  1. LeetCode31 Next Permutation and LeetCode60 Permutation Sequence

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  2. Leetcode60. Permutation Sequence第k个排列

    给出集合 [1,2,3,-,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" "132&qu ...

  3. [Swift]LeetCode60. 第k个排列 | Permutation Sequence

    The set [1,2,3,...,n] contains a total of n! unique permutations. By listing and labeling all of the ...

  4. Permutation Sequence

    The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  5. [LeetCode] Permutation Sequence 序列排序

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  6. Leetcode 60. Permutation Sequence

    The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  7. 【leetcode】 Permutation Sequence (middle)

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  8. 60. Permutation Sequence

    题目: The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of t ...

  9. [Leetcode] Permutation Sequence

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

随机推荐

  1. 【Leetcode】92. Reverse Linked List II && 206. Reverse Linked List

    The task is reversing a list in range m to n(92) or a whole list(206). All in one : U need three poi ...

  2. favourite和favorite的区别

    同一个词,英式和美式的拼写法而已.通常英式英语里的-our-字母组合,到了美式英语里面都成了-or-字母组合,最常见的有英式的 colour,到美式英语成了 color.

  3. ScrollView在调试状态一点击就挂的原因(OnMouseActivate)

    这几天做的一个任务是做一个Dialog,需要在这个Dialog中添加一个自定义的CSrollvew类,但是遇到一个比较扯淡的问题,程序直接运行时可以的,调试状态下一点击CSrollview就挂了.而且 ...

  4. JS——try catch throw

    本例检测输入变量的值.如果值是错误的,会抛出一个异常(错误).catch 会捕捉到这个错误,并显示一段自定义的错误消息: <script> function myFunction() { ...

  5. CSS之float浮动

    CSS理解之float浮动 首先我们看看W3C给出的关于 float 的说明: 参考资料   MDN   W3C

  6. CentOS7将firewall切换为iptables防火墙

  7. HDU_1026_Ignatius and the Princess I_BFS(保存路径)

    Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  8. java主要集合类的数据结构

    1).ArrayList  ArrayList维护着一个对象数组.如果调用new ArrayList()后,它会默认初始一个size=10的数组.  每次add操作都要检查数组容量,如果不够,重新 ...

  9. id拼接保存到单个字段后作为表连接的查询条件

    SELECT q.id, concat(q. NAME) qname, d.id did, d. NAME FROM question_po q LEFT JOIN data_configuratio ...

  10. 如何让 HTML 识别 string 里的 '\n' 并成功换行

    只要在结果所在的 div 的 css 设置: white-space: pre-line; 然后页面就能成功识别 '\n' 并整齐的显示结果了.