【leetcode】60.(Medium) Permutation Sequence

解题思路:
这个题想想用蛮力法会很耗时。然后可以发现里面的一些规律。
总体是递归的做法,以n=4,k=9为例:
首先n=4的所有全排列组合中,前6个是1开头的,第6-11个是2开头的…依次类推
如果要找第9位数,则第9位数必然是2开头的,所以我们先将2加进答案。

剩下1、3、4:
1、3、4组成的6个全排列组合中,前2个是1开头的;第3、4个是3开头的;最后两个是4开头的。
我们第一次找的是第9位,找完第一个数字2之后,现在找的相对位置就是第3位(9-6=3)。在1、3、4组成的全排列中,第3个是3开头的,所以将当前数字3添加到答案,目前答案是23;

然后剩下了1、4:
1、4可以组成2个全排列,第一个是1开头的(其实就是14),第二个是4开头的(其实就是41)。之前找的相对位置是第3位,现在找的相对位置是第1位(3-2=1)
这样递归下去,就得到了2314


提交代码:

class Solution {
    public String getPermutation(int n, int k) {
    	String ans="";
    	int i,unitBlock,blockCnt,blockSize,cnt=n;
        
    	List<Integer> numList=new ArrayList<Integer>();
        for(i=0;i<n;i++)
        	numList.add(i+1);
        
        int allNum=1;
        for(i=1;i<=n;i++)
        	allNum*=i;
        
        while(cnt>0) {
        	unitBlock=allNum/n;blockCnt=0;blockSize=unitBlock;
        	
        	while(k>blockSize) {
        		blockSize+=unitBlock;
        		blockCnt++;
        	}
        	ans+=numList.get(blockCnt).toString();
        	numList.remove(blockCnt);
        	
        	allNum=unitBlock;
        	n--;cnt--;k=k-blockCnt*unitBlock;
        }
        
        return ans;
        
    }
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/AXIMI/article/details/84288528