【算法作业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;
        }
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值