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):


Given n and k, return the kth permutation sequence.

Note: Given n will be between 1 and 9 inclusive.


题解:

开始想用暴力来着,分别用了STL中的next_permutation函数和自己写的字典序实现的next_permutation函数,结果都TLE在n=9这里了,最后上网找了资料才发现这题是有规律的。

以n=3为例,我们用一个数组nums放1,2,3,所以nums = [1,2,3],假设k=4

那么如果先不考虑第一位,后n-1位总共的排列有(n-1)!个,所以第一位数就可以算出来在nums中的index就是(k-1)/(n-1)!,本例中就是(4-1)/2!=1,所以第一位数是nums[1]=2。这里k为什么要减1呢?因为如果k不减1,那么k分别取1,2,3,4,5,6时,我们得到的第一位数分别在nums中的位置是0,1,1,2,2,3,发现正好“错位”,实际应该是0,0,1,1,2,2,把k-1就正好可以得到正确的解。

然后看第二位,注意在算第二位数字前要先更新k和nums,更新k’=(k-1)/(n-1)!=3/2 =1;更新nums,把2后面的每一个数往前移动一位,覆盖前面的数,本例得到的新的nums=[1,3],表示剩下的几位数在1,3中取。那么第二位数在nums中的index就可以算出来是k’/(n-2)!=1/1=1,即nums[1]=3。

最后一位数就是nums中剩下的1了。

代码如下:

 class Solution {
public:
string getPermutation(int n, int k) {
int f = ;
string answer = ""; for(int i = ;i<=n-;i++){
f *= i;
}
//f = (n-1)!
k--; int nums[] = {,,,,,,,,};
for(int i = ;i < n;i ++){
answer += nums[k/f] + ''; for(int j = k/f;j < n;j ++)
nums[j] = nums[j+]; k = k%f;
if(n-i- > )
f = f/(n-i-);
}
return answer;
}
};

代码解释:

第7行循环计算(n-1)!;

15行计算第i位上的数;

17行循环更新nums数组;

20~23行更新k和f,f存放各阶的阶乘,在循环的过程中从(n-1)!一直到1;

注意21行有个判断n-i-1是否大于0,因为最后一次循环,i=n-1,如果不判断,会出现除以0操作,程序会奔溃。

【leetcode刷题笔记】Permutation Sequence的更多相关文章

  1. LeetCode刷题笔记和想法(C++)

    主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...

  2. 18.9.10 LeetCode刷题笔记

    本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...

  3. LeetCode刷题笔记 - 12. 整数转罗马数字

    学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...

  4. Leetcode刷题笔记(双指针)

    1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ...

  5. 【leetcode刷题笔记】Next Permutation

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

  6. 【leetcode刷题笔记】Longest Consecutive Sequence

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

  7. LeetCode刷题笔记(1-9)

    LeetCode1-9 本文更多是作为一个习题笔记,没有太多讲解 1.两数之和 题目请点击链接 ↑ 最先想到暴力解法,直接双循环,但是这样复杂度为n平方 public int[] twoSum(int ...

  8. leetcode刷题笔记

    (1)Best Time to Buy and Sell Stock Total Accepted: 10430 Total Submissions: 33800My Submissions Say ...

  9. leetcode刷题笔记08 字符串转整数 (atoi)

    题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...

随机推荐

  1. C#中后台线程和UI线程的交互

    在C#中,从Main()方法开始一个默认的线程,一般称之为主线程,如果在这个进行一些非常耗CPU的计算,那么UI界面就会被挂起而处于假死状态,也就是说无法和用户进行交互了,特别是要用类似进度条来实时显 ...

  2. CentOs上搭建nginx

    目录 CentOs上搭建nginx 1. 在root环境下安装nginx 1.1 常用工具安装 1.2 关闭iptables规则 1.3 关闭SELinux 1.4 安装C/C++环境和PCRE库 1 ...

  3. 在oracle11g中配置多个DataGuard物理备机

    >> from zhuhaiqing.info 主机配置 alter system set DB_UNIQUE_NAME='starboss' scope=spfile; alter sy ...

  4. POJ 3252 Round Numbers 数学题解

    Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, P ...

  5. explicit 和 implicit 的用法

    explicit 和 implicit 属于转换运算符,如用这两者可以让我们自定义的类型支持相互交换 explicti 表示显式转换,如从 A -> B 必须进行强制类型转换(B = (B)A) ...

  6. hibernate实现多变联合查询

    Hibernate主要支持两种查询方式:HQL查询和Criteria查询.前者应用较为广发,后者也只是调用封装好的接口. 现在有一个问题,就是实现多表连接查询,且查询结果集不与任何一个实体类对应,怎么 ...

  7. C++编译错误C2365

    曾经我们说重定义一般是函数或者变量的重定义.今天遇到了一个新类型的重定义errorC2365 #include <iostream> using namespace std; class ...

  8. ICloneable接口 Clone 深拷贝 浅拷贝

    需要字段本身也实现了深拷贝Clone.应用场景不多,意义不大. 1. 隐含式地要求其子类和引用类也要实现ICloneable接口,如果引用层次比较深类似一个网状或树形接口,增加复杂性. 2. 考虑给s ...

  9. 统计输入的单词中有几个长度大于n的,n是自己指定的,用函数对象实现

    #ifndef COUNT_WORD_H #define COUNT_WORD_H #include <string.h> #include <iostream> #inclu ...

  10. 一个手动备份MySQL数据库的脚本

    #!/bin/bash username=root hostname=localhost password=root mysql -u$username -h$hostname -p$password ...