lintcode 排列序號

2021-07-11 23:59:21 字數 1284 閱讀 5372

想法:

1.對於四位數:4213 = 4*100+2*100+1*10+3

2.4個數的排列有4!種。

當我們知道第一位數的時候,還有3!種方式,當知道第二位數時候還有2!種方式,當知道第三位數的時候還有1!種方式,前面三位數都確定的時候,最後一位也確定了。《這裡是按照高位到地位的順序》

3.對4個數的排列,各位的權值為:3!,2!,1!,0!。第一位之後的數小於第一位的個數是x,第二位之後的數小於第二位的個數是y,第三位之後的數小於第三的個數是z,第四位之後的數小於第四位的個數是w,則abcd排列所在的序列號:index = x*3!+y*2!+z*1!,<0!=0>

在數的排列中,小數在前面,大數在後面,所以考慮該位數之後的數小於該為的數的個數,這裡我自己理解的也不是很透,就這樣。

4.例如 4213;x= 3,y = 1,z=0,index = 18+2=20

123;x = 0,y=0,index = 0

321;x= 2,y=1,index = 2*2!+1*1! = 5

long long permutationindex(vector& a) 

int result=1,x=1,y=1;

for(int i=n-2;i>=0;i--)

return result;

}

注意!!!!

函式lower_bound()在first和last中的前閉後開區間進行二分查詢,返回大於或等於val的第乙個元素位置。如果所有元素都小於val,則返回last的位置

舉例如下:

乙個陣列number序列為:4,10,11,30,69,70,96,100.設要插入數字3,9,111.pos為要插入的位置的下標

則pos = lower_bound( number, number + 8, 3) - number,pos = 0.即number陣列的下標為0的位置。

pos = lower_bound( number, number + 8, 9) - number, pos = 1,即number陣列的下標為1的位置(即10所在的位置)。

pos = lower_bound( number, number + 8, 111) - number, pos = 8,即number陣列的下標為8的位置(但下標上限為7,所以返回最後乙個元素的下乙個元素)。

排列序號 LintCode

給出乙個不含重複數字的排列,求這些數字的所有排列按字典序排序後該排列的編號。其中,編號從1開始。樣例 例如,排列 1,2,4 是第 1 個排列。思想 直接計算。例如 2,3,4,1 首先,另存到乙個陣列中,排序,再利用map,獲得數字與位置的關係 遍歷陣列a,在本例中,對於2,前面存在以1,開頭的所...

lintcode 排列序號

給出乙個不含重複數字的排列,求這些數字的所有排列按字典序排序後該排列的編號。其中,編號從1開始。例如,排列 1,2,4 是第 1 個排列。排列一共有n 種,最高位定下來之後一共是n個 n 1 種排列,根據這種性質,可以通過查詢低位比高位小的個數來計算當前位置.比如,1247的排列個數是4 個.尋找2...

Lintcode 197 排列序號

math 舉例 1,2,3,4 第一位是1,沒有比1小的,所以 0,第二位是2,後面沒有比2小的,所以0 結果 0 1 1 舉例 4,3,2,1 第一位是4,1,2,3 小於4,所以 3 3 第二位是2,2,1 小於3,2 2!第三位是2,1 小於2,1 1!結果 3 3 2 2!1 1!1 24 ...