博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
60 Permutation Sequence
阅读量:6870 次
发布时间:2019-06-26

本文共 1434 字,大约阅读时间需要 4 分钟。

一开始想用permutations那种全排列来计算,DFS写了好久发现人家n可以是9位数,递归几千万次这得什么计算机做得到。。

DFS(只能计算n很小的情况。。不可行)

String res = "";public String getPermutation(int n, int k) {   int[] count = new int[1];   int[] num = new int[n];   for (int i = 0; i < n; i++) {      num[i] = i + 1;   }   backtracking(count, k, num, "", new boolean[num.length]);   return res; } private void backtracking(int[] count, int k, int[] nums, String item, boolean[] used) {   if (item.length() == nums.length) {      if (++count[0] == k) {         res = item;      }      return;   }   for (int i = 0; i < nums.length; i++) {      if (!used[i]) {         used[i] = true;         backtracking(count, k, nums, item + nums[i], used);         used[i] = false;      }   }}复制代码

数学方法:

每次计算最高位的数字,用一个数组保存剩下的数字。index代表剩下的数字的位置。 index计算的方法是: index = k / (n-1)! 这个index就表示,之前有index组个全排列(开头是同一个数字的一组全排列算是一组) k就减去之前index * (n-1)!那么多个排列,再循环计算新的index即可。

public String getPermutation(int n, int k) {		int[] factorial = new int[n];		factorial[0] = 1;		for (int i = 1; i < n; i++) {			//阶乘			factorial[i] = i * factorial[i - 1];		}		List
nums = new ArrayList<>(); for (int i = 1; i <= n; i++) { nums.add(i); } //k从0开始 k--; StringBuilder res = new StringBuilder(); for (int i = 1; i <= n; i++) { int index = k / factorial[n - i]; res.append(nums.remove(index)); k -= index * factorial[n - i]; } return res.toString(); }复制代码

转载于:https://juejin.im/post/5a3134255188253d6817959c

你可能感兴趣的文章
四:Mysql存储引擎简介
查看>>
有关JS
查看>>
SpringMVC日期类型转换问题三大处理方法归纳
查看>>
nodejs读文件
查看>>
OpenCV build linux
查看>>
java 同步块(Java Synchronized Blocks)
查看>>
Java对象浅克隆、深克隆及序列化
查看>>
使用FIO测试磁盘I/O性能
查看>>
iOS-charts 绘制漂亮 图标 大饼
查看>>
关于Java事务踩过的坑
查看>>
Android 控件布局常用属性
查看>>
Python 06 lambda函数
查看>>
ps时间轴制作渐隐动态签名
查看>>
浅尝超融合之Nutanix(上)介绍篇
查看>>
制作不用密码可立即登入的 ssh 用户
查看>>
xen虚拟化实战系列(九)之xen虚拟机时间配置
查看>>
C语言编程透视
查看>>
invocationtargetexception异常记录
查看>>
修改ICA端口号
查看>>
Centos6.4 安装ossec 2.7(1)
查看>>