【leetcode】60.(Medium) Permutation Sequence
阿新 • • 發佈:2018-11-22
解題思路:
這個題想想用蠻力法會很耗時。然後可以發現裡面的一些規律。
總體是遞迴的做法,以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;
}
}
執行結果: