【算法作业15】LeetCode 357. Count Numbers with Unique Digits

357. Count 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,要求所有从0到10的n次方之间的所有每一位数字都不同的数的个数。

我的想法是,对于不同的n来说,相当于就是判断由n位数构成的数字中不出现重复数字的个数(对n=0除外,n=0的情况下只有0这一个可能的结果)。由于一共只有10个数字,因此n>10的情况下和n=10的情况是一样的。因此将所有的n分为三类,n=0、n=1两种稍微特殊一点的情况,n=2~10的通用情况,和n>10的归为n=10的情况。

对于n=0和n=1,直接返回1和10,可以不做过多的处理。

对于n=2~10,由于是有至少两位数组成,且第一位不为0。因此第一位一共有9种取法,从第二位到第n位分别是9、8、7、...、10-n种取法。再加上最初的10种只有一位数的取法即是最终所需要的答案。

对于n>10的情况,只需要将其n改为10,并继续执行n=2~10所使用的代码即可完成。

这道题我确实是没想到有什么和动态规划有关的算法,看了题目给的提示也有提到说用动态规划需要用到我自己写的这种排列组合的方式,然而并没有太搞懂这个和动态规划有什么联系……



代码:

class Solution {
public:
    int countNumbersWithUniqueDigits(int n) {
        if (n == 0)
            return 1;
        else if (n == 1)
            return 10;
        else if (n > 1)
        {
            int first = 9;
            int sum = 10;
            if (n > 10)
            {
                n = 10;
            }
            for (int i = 1; i < n; i++)
            {
                first *= (10 - i);
                sum += first;
            }
            return sum;
        }
    }
};


你可能感兴趣的:(算法作业)