60 Permutation Sequence

本文介绍了两种求解第K个排列的算法方法。一种是使用DFS进行全排列搜索,适用于n较小的情况;另一种是利用数学方法,通过计算确定每个位置上的数字,适用于大数情况。文中还给出了具体的代码实现。

一开始想用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<Integer> 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值