第k个排列
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"
给定 n 和 k,返回第 k 个排列。
说明:
  • 给定 n 的范围是 [1, 9]。
  • 给定 k 的范围是[1,  n!]。
示例 1:
输入: n = 3, k = 3
输出: "213"
示例 2:
 
输入: n = 4, k = 9
输出: "2314"
 
思路:观察一下:  我们取k=17。首先数组都是从0开始计数的,所以k-1=16。
从16开始,先可以看出,每一组都是6个数字,n=4,16/(n-1)!  =2,也就是数组的第三行的, s[2]。
继续观察,111111 出现了6次,22,33,44都是只出现2次,观察发现出现的次数为(n-1)!
因此得到如下规律   index=k/(n-1)!   k%=(n-1)!  (k为每一组全排列中为了得到的序号,因此k不断做除法,同时得到下一个更小的全排列)
同时我们取出了每个数字之后,都需要将其删除,因为不能重复出现。
[[1,2,3,4],[1,2,4,3],[1,3,2,4],[1,3,4,2],[1,4,3,2],[1,4,2,3]
[2,1,3,4],[2,1,4,3],[2,3,1,4],[2,3,4,1],[2,4,3,1],[2,4,1,3],
[3,2,1,4],[3,2,4,1],[3,1,2,4],[3,1,4,2],[3,4,1,2],[3,4,2,1],
[4,2,3,1],[4,2,1,3],[4,3,2,1],[4,3,1,2],[4,1,3,2],[4,1,2,3]]
c++解法:
class Solution {
public:
string getPermutation(int n, int k) {
string s="";
vector<int> f(n,); //声明一个初始值都为1,长度为n的数组 string ans;
for(int i=;i<n;i++)f[i]=f[i-]*i; //这里用一个vector来表示(n-1)的阶乘
k--;
for(int i=n;i>=;i--){
int index=k/f[i-];
k%=f[i-];
ans.push_backdex]);
s.erase(index,); //erease 的用法,erase(index,num) num为剔除的个数
}
return ans;
}
小结一下:一开始就想到了这种思路,首先通过vector <int>  f(n,1)构造了一个排列组合的数n!  ,之后通过找到了索引Index   和下一个更小的全排列的k。index=k/n!  ;  k=k%(n-1)!  
找到了索引之后,因为用过了这个数字就要删除,而c++中的string数组具有删除的功能.
 
更为简便的是利用STL中的algorithm中的函数next_permutation(),得到下一个全排列

Java版:

class Solution {
public String getPermutation(int n, int k) {
List<Integer> list=new ArrayList();
StringBuilder sb=new StringBuilder();
for(int i=1;i<=n;i++){
list.add(i);
}
k--;
int fac=1;
for(int i=n;i>=1;i--){
fac=fac*i;
}
for(int i=n;i>=1;i--){
fac/=i; //获得(n-1)!的阶乘
int index=k/fac;
k%=fac;
sb.append(list.get(index));
list.remove(index);
}
return sb.toString();
}
}

leetcode-第k个排列(Java和c++版)的更多相关文章

  1. Java实现 LeetCode 60 第k个排列

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

  2. LeetCode:第K个排列【60】

    LeetCode:第K个排列[60] 题目描述 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: &quo ...

  3. LeetCode 笔记21 生成第k个排列

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

  4. LeetCode 60 第K个排列

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

  5. LeetCode(60): 第k个排列

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

  6. LeetCode 中级 - 第k个排列(60)

    可以用数学的方法来解, 因为数字都是从1开始的连续自然数, 排列出现的次序可以推 算出来, 对于n=4, k=15 找到k=15排列的过程: 1 + 对2,3,4的全排列 (3!个) 2 + 对1,3 ...

  7. LeetCode 60. 第k个排列(Permutation Sequence)

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

  8. [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 ...

  9. LeetCode:下一个排列【31】

    LeetCode:下一个排列[31] 题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排 ...

随机推荐

  1. 一点一点看JDK源码(四)java.util.ArrayList 中篇

    一点一点看JDK源码(四)java.util.ArrayList 中篇 liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 在前篇中 ...

  2. 12种开源Web安全扫描程序

    转自:https://blog.csdn.net/wh211212/article/details/78620963 赛门铁克的一个有趣的报告显示,76%的被扫描网站有恶意软件 如果您使用的是Word ...

  3. Jquery与js简单对比

    //Javascript window.onload=function () { var oBtn=document.getElementById('btn1'); oBtn.onclick=func ...

  4. Zabbix——自动发现

    前提条件: Zabbix版本为4.0 固定网段寻找网络设备,并添加组.添加模板.添加proxy. 设置完毕,等待~~ 如果没有问题,将会直接出现在host中.

  5. ASP.NET Core获取微信订单数据

    前几天对接了一波微信的订单,分享出来 1.生成签名 根据微信要求把appid.商户号.随机数.和订单号还有商户平台的密钥拼接成一个字符串然后进行MD5加密 2.拼接请求XML 然后用拼接好的XML向微 ...

  6. Spark运行模式_local(本地模式)

    本地运行模式 (单机) 该模式被称为Local[N]模式,是用单机的多个线程来模拟Spark分布式计算,直接运行在本地,便于调试,通常用来验证开发出来的应用程序逻辑上有没有问题. 其中N代表可以使用N ...

  7. 由OpenResty粘合的企业Web架构

    前言:    2012年2月章亦春(agentzh)在Tech-Club的一次线下聚会上以<由Lua 粘合的Nginx生态环境>为主题做了演讲,分析了企业Web架构的趋势,即一个看起来完整 ...

  8. Nginx初体验(一):nginx介绍

    今天我们来介绍一下Nginx. Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件(IMAP/POP3)代理服务器 特点: 反向代理,负载均衡,动静分离 首先我们来介绍一下正向代理服务器 ...

  9. WPF Prism MVVM 中 弹出新窗体. 放入用户控件

    原文:WPF Prism MVVM 中 弹出新窗体. 放入用户控件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_37214567/artic ...

  10. 实现动态的XML文件读写操作(依然带干货)

    前言 最近由于项目需求,需要读写操作XML文件,并且存储的XML文件格式会随着导入的数据不同而随时改变(当然导入的数据还是有一定约束的),这样我们要预先定义好XML文件的格式就不太现实了,如何实现不管 ...