題目來源
計算1到10^n數字中每一個數字都是唯一的數。
原來以為很復雜,需要一系列推導,沒想到結果答案那么簡單。
f(0) = 1
f(1) = 10
f(2) = 9 * 9
f(3) = f(2) * 8
f(4) = f(3) * 7
...
f(11) = f(10) * 0 = 0
f(12) = f(13) = ... = 0
當兩位數的已經都求出來之后,求三位數,往低位插一個數字,有8種選擇。
代碼如下:
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
vector<int> dp(n+1, 0);
if (n == 0)
return 1;
if (n == 1)
return 10;
if (n == 2)
return 91;
dp[1] = 10;
dp[2] = 81;
int m = min(n, 10);
for (int i=3; i<=m; i++)
dp[i] = dp[i-1] * (11-i);
int sum = 0;
for (int i=1; i<=n; i++)
sum += dp[i];
return sum;
}
};
優化之后如下:
class Solution {
public:
int countNumbersWithUniqueDigits(int n) {
vector<int> dp(n+1, 0);
if (n == 0)
return 1;
int sum = 10;
int uniqueDigits = 9;
int availableNum = 9;
while (n-- > 1 && availableNum > 0) {
uniqueDigits = uniqueDigits * availableNum;
sum += uniqueDigits;
availableNum--;
}
return sum;
}
};