1. 程式人生 > >【leetcode】60.(Medium) Permutation Sequence

【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; } }

執行結果:
在這裡插入圖片描述