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:
-
- A direct way is to use the backtracking approach.
- 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.
- This problem can also be solved using a dynamic programming approach and some knowledge of combinatorics.
- Let f(k) = count of numbers with unique digits with length equals k.
- f(1) = 10, ..., f(k) = 9 * 9 * 8 * ... (9 - k + 2) [The first factor is 9 because a number cannot start with 0].
题目大意:
给一个非负整数n,找出[0,10^)之间各个位上数字不重复出现的数的个数,如n = 3,找出[0,1000)之间符合标准的数,如123,245,但122不符合要求,2重复出现。
根据提示,题目可以用回溯和动态规划解决。这里使用的动态规划做的。看了讨论区,复杂度还可以降低
1 public class Solution { 2 public int countNumbersWithUniqueDigits(int n) { 3 if(n == 0) 4 return 1; 5 int result[] = new int[11]; 6 result[1] = 10; 7 8 int preFactor = 9; 9 for(int i = 2; i <= 10 && i <= n; i++){ 10 preFactor *= (9 - i + 2); 11 result[i] = (preFactor + result[i - 1]); 12 }//for 13 14 if(n > 10) 15 return result[10]; 16 return result[n]; 17 } 18 }