Lintcode 197 排列序號

2021-10-07 22:05:57 字數 794 閱讀 6743

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

當前的index = 它之前所有字典序的排列的數之和 + 1

舉例:4, 2, 3, 1

第1位,比4小的可能有3位(1,2,3)[1,2,3,4; 2,1,3,4; …],則可能的排列位3 * 3!

確定第1位為4,第二位,比第二位小的為(2),則可能的排列為1 * 2!

確定第二位為3,則比第三位小的只能是(1),其排列為1 * 1!

第四位沒得選,可能的排列為0

結果, 3 * 3! + 1 * 2! + 1 * 1! + 1 = 22

綜上,假設當前第i位的可選candidates數為cand[i] , 則其排列和為sum(candi!)

public

class

solution

} permu *= a.length - i -1;

res += count * permu;

}return res +1;

}}

潛在問題:

兩次過 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 ...

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

leetcode197 排列序號

題目描述 給出乙個不含重複數字的排列,求這些數字的所有排列按字典序排序後該排列的編號。其中,編號從1開始。例如,排列 1,2,4 是第 1 個排列。class solution else return count 運用stl標準庫中的next permutation 方法最方便,但是複雜度過高,不通...