题目
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]
)
分析
这个问题在leetcode中被归类为动态规划,但其实它也可以说归类为分治算法。根据题意,我们需要求0~10n之间满足每位数字都不相同的数的总个数。
当0 < n <= 10,转化为子问题,假设我们已知0~10n-1之间满足条件的总个数设为f(n-1),则f(n)=f(n-1)+P(10,n)-P(9,n-1),其中P指排列数。
当n = 0时,返回值为1
当n > 10时,返回值为0
代码
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
if (n == 0)
return 1;
if (n > 10)
return 0;
int a = 9;
for (int i = 11 - n;i <= 9;i++)
a *= i;
return a + countNumbersWithUniqueDigits(n-1);
}
};