美文网首页
Count Numbers with Unique Digits

Count Numbers with Unique Digits

作者: 我叫胆小我喜欢小心 | 来源:发表于2017-04-16 10:35 被阅读8次

题目来源
计算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;
    }
};

相关文章

网友评论

      本文标题:Count Numbers with Unique Digits

      本文链接:https://www.haomeiwen.com/subject/ifcaattx.html