leetcode197 排列序號

2021-08-25 22:12:08 字數 1222 閱讀 6316

題目描述:

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

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

class solution else

}return count;

} };

運用stl標準庫中的next_permutation()方法最方便,但是複雜度過高,不通過

第二種方法:

對於四位數,有4!種排列方式;

當知道第一位數,還有3!種方式;

當知道第二位數,還有2!種方式;

當知道第三位數,還有1!種方式;

前面三位都確定了,最後一位也確定了;

因此對前面n-1位,各位的權值為: (n

−1)!

( n−

1)

!, (n

−2)!

( n−

2)

!, (n

−3)!

( n−

3)

!, … , 1!

1

!第一位之後的數小於第一位的個數為x1

x 1;

第二位之後的數小於第二位的個數為x2

x 2;

第三位之後的數小於第二位的個數為x3

x 3;

…… 第(n

−1) (n−

1)

位之後的數小於第(n

−1) (n−

1)

的個數為xn

−1x n−

1;

因此index = x1

x

1* (n

−1)!

( n−

1)

!+x2

x

2* (n

−2)!

( n−

2)

!+ … +xn

−1x n−

1* 1!

1 !+

1 1

class solution 

}sum += index * fab(a.size() - i - 1);

}return sum + 1;

}long

long fab(int x)

};

197 排列序號

是 這道題採取暴力解法會超時,應當對於原陣列的每乙個位置找到其後有多少個數比它小,然後再相加這些數與對應的權的成績。class solution long long ans 1,fac 1,cc 1 for int i len 2 i 0 i ans fac cc c i return ans 注意...

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 ...

兩次過 Lintcode 197 排列序號

給出乙個不含重複數字的排列,求這些數字的所有排列按字典序排序後該排列的編號。其中,編號從1開始。樣例 1 輸入 1,2,4 輸出 1樣例 2 輸入 3,2,1 輸出 6需要知道乙個演算法 康托展開。原理介紹 x a 0 n 1 a 1 n 2 a n 1 0 a i 指的是位於位置i後面的數小於a ...