Permutation Sequence

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

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"

Given n and k, return the kth permutation sequence.

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

返回第k个排好序的字符串  要是先将所有数字进行排序然后去第K个 显然复杂度较高  由于 每次可以根据 k与(n-1)!的值来判定开始的数字 所以 只要使用递归 每次确定一个数 当剩2个时  只剩两种情况 其中 k的递归关系为 k=k - devide * jiech(n-1) 代码如下:

public class Solution {
    public static String getPermutation(int n, int k) {	
		String res="";
		Map<Integer,Integer> hm=new HashMap<Integer, Integer>();
		res=getpermutation(res,hm,n,k,n);
		return res;
	}
	public static String  getpermutation(String s,Map<Integer,Integer> hm,int n,int k,int t){
	    if(n==1)return "1";
		if(n==2){
			if(k==1){
				for (int i = 1; i <= t; i++) {
					if (!hm.containsKey(i)) {
						s += i;
					}
				}
			}
			if(k==2){
				for (int i = t; i >= 1; i--) {
					if (!hm.containsKey(i)) {
						s += i;
					}
				}
			}
			return s;
		}else {
			int jiech = 1;
			for (int i = 1; i <= n - 1; i++) {
				jiech = jiech * i;
			}
			int devide = (k-1) / jiech;
			int addint = 0;
			int count = 0;
			for (int i = 1; i <= t; i++) {
				if (!hm.containsKey(i)) {
					count++;
					if (count == devide + 1) {
						addint = i;
						break;
					}
				}
			}
			hm.put(addint, 1);
			return getpermutation(s + addint, hm, n - 1, k - devide * jiech,t);
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值