天天看點

lintcode Permutation Index

給出一個不含重複數字的排列,求這些數字的所有排列按字典序排序後該排列的編号。其中,編号從1開始。

樣例

例如,排列[1,2,4]是第1個排列。

思路:

1.直接暴力,利用c++中<algorithm>中的next_permutation()方法不斷的尋找下一個全排列,直到相等為止!

2.首先觀察一個全排列, 例如:95412 = X

  a.題目轉換成按照字典序,這個全排列之前有多少個全排列。

  b.X的前面的所有全排列中,對于位置1上可以是5, 4, 1, 2任意一個數,而且對應的全排列的基數都是4!個。

  c.同理位置2, 3, 4, 5對應的基數分别是,3!,2!,1!,0!(0!==0)。

  d.得到該位置對應的基數後,那麼該位置對應多少個可變數字?9所在位置對應的可變數字的個數為4,分别是5,4,1,2;

   5所在位置對應的可變數字是4,1,2;4所在位置對應的可變數字是1,2,;1所在位置的對應的可變數字:無。2所在位置

     對應可變數也是無。

  e.可以得到結論,X全排列某個位置上對應的可變數字的個數 == 這個數後面有多少個比它小的數的個數。

  f.為了得到某個數後面有多少個比它小的數的個數,我們采用折半插入排序(從後向前插入)。

繼續閱讀