題目描述:
給出乙個不含重複數字的排列,求這些數字的所有排列按字典序排序後該排列的編號。其中,編號從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 ...