# LeetCode Count Numbers with Unique Digits

LeetCode Count Numbers with Unique Digits

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]`)

Hint:

1. A direct way is to use the backtracking approach.
2. Backtracking should contains three states which are (the current number, number of steps to get that number and a bitmask which represent which number is marked as visited so far in the current number). Start with state (0,0,0) and count all valid number till we reach number of steps equals to 10n.
3. This problem can also be solved using a dynamic programming approach and some knowledge of combinatorics.
4. Let f(k) = count of numbers with unique digits with length equals k.
5. f(1) = 10, ..., f(k) = 9 * 9 * 8 * ... (9 - k + 2) [The first factor is 9 because a number cannot start with 0].

• k=1，一位数，可以填入0~9这10个数，结果为10
• k=2，两位数，十位填入1~9这9个数，个位填入0~9中除了十位的那个数字，有9种情况，结果为9*9
• k=3，三位数，百位填入1~9这9个数字，十位填入0~9中除了百位的那个数字，有9种情况，个位填入0~9中除了百位和十位的那两个数字，有8种情况，结果为9*9*8
• ...
• k=n，结果为9*9*8*...*(9-n+2)

```class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
if (n == 0)return 1;
if (n == 1)return 10;
int ans = 10, last = 9;
for (int i = 2; i <= n; ++i) {
last *= (9 - i + 2);
ans += last;
}
return ans;
}
};
```