题目:
Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n.
Example:
Given n = 2, return 91. (The answer should be the total numbers in the range of 0 ≤ x < 100, excluding [11,22,33,44,55,66,77,88,99]
)
思考:
这一题我使用的是DP的思想,DP[i]则表示在0 ≤ x < 10^i的唯一数字数的个数,那么很明显,首先DP[0] = 0;而DP[i] = DP[i-1]+(i个数字唯一数的个数)。
i个数字唯一数的个数,首先第一位可取的数字是(1-9)9个数字,之后每一位都可取(0-9)10个数字,但是由于之前的位数取了一个数字,因此计算起来为9*(i-1)的阶乘,而当i>9时,i个数字很明显不可能组成一个唯一数,所以dp[i](i>9)==dp[9]。
代码:
int countN(int N){
int factorial = 9;
for(int i = 1;i < N;i++){
factorial*=(10-i);
}
return factorial;
}
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
vector<int> dp(n+1,0);
dp[0] = 1;
for(int i = 1;i <=n; i++){
dp[i] = dp[i-1] + countN(i);
}
return dp[n];
}
};
结果: