Leetcode 357 Count Numbers with Unique Digits
解题思路:
(1) 当n=0时,0<=x<10^0 ==> 有且仅有1个数; f(0) = 1;
(2)当n=1时,0<=x<10^1 ==> 总有9个数(不考虑的0的话),(0--9),共10个数不同; f(1) = 9 + f(0) = 10;
(3)当n=2时,0<=x<10^2 ==> 其中,两位数是这样构成的, 十位:从 1--9 中选择1个,假设为 选择的是1,那么个位只能从 0,2,3,4,5,6,7,8,9中选,计 9*9 = 81 个数;再加上 0 -- 9的10个数,共计 81 + 10 = 91个数不同;f(2) = 9*9 + f(1) = 91;
(4) 当n=3时,0<=x<10^3 ==> 其中,三位数是这样构成的, 百位:从 1--9 中选择1个,假设为 选择的是1,那么十位只能从 0,2,3,4,5,6,7,8,9中选,假设选择的是2,那么个位只能从 0,3,4,5,6,7,8,9中选,计 9*9*8 = 648 个数;再加上0--99的91个数,共计 648 + 91= 739个数不同;f(3) = 9*9*8 + f(2) = 739;
....
当n<=10时,设n = k , f(n) = 9*9*8*...*(9-k+1) + f(n-1);
当n>10时,有超过了10位,那么至少必有1位重复,所以 f(n) = f(10);
AC代码如下,仅供参考。
(在这里,用到了打表)。
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
int array[11] = { 1,10,91,739,5275,32491,168571,712891,2345851,5611771,8877691 };
if (n <= 10)return array[n];
else return array[10];
}
};