給出一個不含重複數字的排列,求這些數字的所有排列按字典序排序後該排列的編号。其中,編号從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.為了得到某個數後面有多少個比它小的數的個數,我們采用折半插入排序(從後向前插入)。

