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解决问题:举个例子,n=3, 首先,肯定小于n=2的10倍;
再者,只有两位的unique的数,在末尾添上任意其中一个数,就不符合条件,有2*sum[2];
只有一位的unique的数, 在末尾添上与之一样的数,就不符合条件,有1*sum[3];
一位都没有的数,就是0,在末尾添上任意数都符合要求,于是就有0*sum[0];
所以,sum[n]=sum[n-1]*10-(n-1)*digi[n-1]-(n-2)*digi[n-2]-............0*digi[0]
c++实现:
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
vector<int> digi;
vector<int> sum;
digi.push_back(1);
digi.push_back(9);
sum.push_back(1);
sum.push_back(10);
int sum_i=10;
int temp=9;
for (int i=2;i<=n;i++){
int a=sum[i-1]*10-temp;
sum.push_back(a);
digi.push_back(a-sum[i-1]);
temp=temp+digi[i]*i;
}
return sum[n];
}
};