这道题还挺好的,假设你的思路是每次生成一个全排列,然后累计到k次,那么停下来吧。肯定超时了亲。。

微软今年的笔试题里有一道类似的,我之前已经提到过了。是唯独0和1的字符串,求第k个排列是什么样子的。这道题比那个要难一些,可是整体的思路是一样的。

如果有n个数要组成排列。求第k个排列。

像填表一样,从高位往地位。逐个填写。先考虑有n-1个数要组成排列。最多有(n-1)!种情况,当第n个数添加后,第n个数能够是从1添加到n的,没添加1。所包括的全排列数就会添加(n-1)!,因此,如果用k/(n-1)!,得到的就是第高位排列应该出现的数字。为了计算后面的位应该填什么,k要更新为k%(n-1)!。

计算第i位应该填的是k/(i-1)!。

不,不不过这样。这里应该是这道题和01串那道题一个非常大的不同之处。在填第i位的时候。还要看剩下了哪些数字,应该在剩下的那些数字里找第k/(i-1)!个。

代码里为什么要先对k减1。用简单的样例就能理解。

就像在一个矩阵中。给了矩阵中的第k个数,要求它相应矩阵中的那个位置。也会先对他减一的。题目中给出了所參与排列数的取值范围,因此能够先把阶乘算出来,放到数组里。

class Solution {
public:
string getPermutation(int n, int k) {
int fac[10];
bool vis[10];
memset(vis, 0, sizeof(vis));
fac[0] = 1;
for(int i=1;i<10;i++)
fac[i] = fac[i-1]*i;
string res(n, '0');
--k;
for(int i=n-1;i>=0;i--){
int temp = k/fac[i];
int j=1;
for(;j<10;j++){
if(vis[j] == 0)
temp--;
if(temp<0)
break;
}
res[n-i-1] = '0'+j;
vis[j] = 1;
k%=fac[i];
}
return res;
}
};

leetcode第一刷_Permutation Sequence的更多相关文章

  1. leetcode第一刷_Set Matrix Zeroes

    这个题乍一看非常easy,实际上还挺有技巧的.我最開始的想法是找一个特殊值标记.遇到一个0,把他所相应的行列中非零的元素标记成这个特殊值.0值保持不变,然后再从头遍历一次,碰到特殊值就转化成0. 问题 ...

  2. leetcode第一刷_Permutations II

    当有反复元素的时候呢? 不用拍脑袋都会想到一种方法,也是全部有反复元素时的通用处理方法,维护一个set,假设这个元素没增加过就增加,增加过了的忽略掉.可是,在这道题上这个通用方法竟然超时了! 怎么办? ...

  3. leetcode第一刷_Populating Next Right Pointers in Each Node II

    很自然的推广,假设去掉全然二叉树的条件呢?由于这个条件不是关键,因此不会影响整体的思路.做法依旧是每次找到一层的起点,然后一层一层的走. 假设是全然二叉树的话,每层的起点就是上一层起点的左孩子,兄弟之 ...

  4. leetcode第一刷_Merge Intervals

    看到这个题我就伤心啊,去微软面试的时候,第一个面试官让我做的题目就是实现集合的交操作,这个集合中的元素就像这里的interval一样.是一段一段的.当时写的那叫一个慘不忍睹.最后果然被拒掉了. .好好 ...

  5. leetcode第一刷_N-Queens

    八皇后问题应该是回溯法的教学典范.在本科的时候,有一门课叫面向对象.最后的附录有这个问题的源码.当时根本不懂编程,照抄下来,执行一下出了结果都非常开心,哎. 皇后们的限制条件是不能同行同列,也不能同对 ...

  6. leetcode第一刷_Gray Code

    说到格雷码,应该没人不知道,详细它有什么用,我还真不是非常清楚,我室友应该是专家.生成的规律不是非常明显,之前看到帖子讲的,这会儿找找不到了.. 思想是这种,假设有n位,在第2^(n-1)个编码以下画 ...

  7. leetcode第一刷_Combination Sum Combination Sum II

    啊啊啊啊.好怀念这样的用递归保存路径然后打印出来的题目啊.好久没遇到了. 分了两种,一种是能够反复使用数组中数字的,一种是每一个数字仅仅能用一次的.事实上没有多大差别,第一种每次进入递归的时候都要从头 ...

  8. leetcode第一刷_Count and Say

    水题. 描写叙述的还挺麻烦的,实际上就是纸老虎,用两个string,一个存上一轮的结果,一个用来更新出这一轮的结果,每次扫描上一轮,统计一个字符出现的次数,然后把这个次数和字符增加到这一轮的字符串中就 ...

  9. leetcode第一刷_Jump Game

    这个题事实上非常easy的,我一開始想复杂了,它没要求记录路径,事实上仅仅要看一下每一步之后所能延伸到的最远的位置就能够了,在这一个最远位置前面的那些位置,都是能够到达的,假设扫到了某个i,它大于当前 ...

随机推荐

  1. 下载,配置环境变量,第一个demo

    一.在 http://www.oracle.com 下载java JDK 安装到自定义的地方. 二.配置环境变量:在我的电脑→高级系统设置→环境变量 ① 找到Path新增一个路径(该路径为JDK存放的 ...

  2. java2 实用教程第四章

    博主原创 转载请注明地址 博客:http://www.cnblogs.com/13224ACMer/ 1成员变量 声明变量所声明的变量被称为成员变量和域变量,成员变量在类中的书写位置与前后顺序无关, ...

  3. Python之自动单元测试之一(unittest使用实例)

    软件的测试是一件非常乏味的事情,在测试别人编写的软件时尤其如此,程序员通常都只对编写代码感兴趣,而不喜欢文档编写和软件测试这类"没有创新"的工作.既然如此,为什么不让程序员在编写软 ...

  4. 【bzoj2729】[HNOI2012]排队 组合数学+高精度

    题目描述 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) 输入 ...

  5. IP地址资源的分配和管理

    IP地址资源的分配和管理 参考资料 https://wenku.baidu.com/view/3bdf94172cc58bd63086bd8c.html   http://www.iana.org/ ...

  6. Java连接SQLite数据库

    下载java包:sqlite-jdbc-3.7.2.jar,放到java工程目录lib下 如下代码实例: import java.sql.*; import org.sqlite.JDBC; /** ...

  7. ecs01初始化node环境

    npm install 报错 > uglifyjs-webpack-plugin@ postinstall /opt/apps/iview-admin/node_modules/webpack/ ...

  8. The Luckiest number(hdu 2462)

    给定一个数,判断是否存在一个全由8组成的数为这个数的倍数 若存在则输出这个数的长度,否则输出0 /* 个人感觉很神的一道题目. 如果有解的话,会有一个p满足:(10^x-1)/9*8=L*p => ...

  9. 剑指Offer 二进制中一的个数

    链接:https://www.nowcoder.com/questionTerminal/8ee967e43c2c4ec193b040ea7fbb10b8 来源:牛客网 public class So ...

  10. es6总结(四)--对象