leetcode刷题,总结,记录,备忘 357

leetcode357Count Numbers with Unique Digits

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]

举个例子,比如n=3,我们求的就是0 - 999之间有多少独一无二的数字。我们可以拆分一下,求100到999之间有多少独一无二的数字,然后用0 - 99的的结果与其相加即可。同理求0 - 99 ,先求 10 - 99 再用0 - 9 的结果进行相加,由于我们已经知道0 - 9 的结果是10,所以只要求 10 - 99即可。先看第一位数字,可取值的范围是1 - 9,一共有9种可能,第二位数字可取值范围是0 - 9,理论上可以取10个数,但是考虑与第一位上的数字重复的情况,只能取9个,所以 10 - 99 之间独一无二数字个数为9 X 9 = 81个。现在再回头看下100 - 999之间,在10 - 99 的基础上,直接看第三位数字,取值范围0 - 9 ,由于前两位数字可能出现重复的情况,所以只能取8个数字,所以100 - 999 之间的独一无二数字应该只有 81 X 8 = 648个,再加上之前的0 - 99 之间的个数,0 - 999 之间的独一无二数字个数为648 + 81 + 10 = 739个。依次类推,以3为初始值,n多加一位,该位上的可选择的数字个数就-1,代码如下。

class Solution {
public:
    int countNumbersWithUniqueDigits(int n) {
        if (n == 0)
        {
            return 1;
        }
        if (n == 1)
        {
            return 10;
        }
        
        vector dp(n + 1, 0);
        
        dp[2] = 91;
        
        for (int i = 3; i < n + 1; ++i)
        {
            int sum = 81;
            for (int j = 3; j <= i; ++j)
            {
                sum *= (11 - j);
            }
            
            dp[i] = sum + dp[i - 1];
        }
        
        return dp[n];
    }
};


你可能感兴趣的:(leetcode)