Count Numbers with Unique Digits

題目來源
計算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;
    }
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容