LeetCode 357. Count Numbers with Unique Digits 题解(C++)

本文提供了一种使用动态规划解决LeetCode 357题的方法,该题要求计算在0到10^n范围内具有唯一数字的所有整数的数量。文中详细解释了动态规划的实现过程,并给出了C++代码示例。

LeetCode 357. Count Numbers with Unique Digits 题解(C++)


题目描述

  • Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10^n.

举例

  • 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])

思路

  • 用动态规划来完成这道题。f(i)表示位数为i且里面每一位的数字都是唯一的数字个数。比如:
    f(1)=10;
    f(1)=9*9,第一个9是从1~9中选择一个数字(因为0不能当做两位数的第一个数),第二个9是从0~9中选择一个数字(除去第一次已经选择过,这次不能选择的数字),共9种可能;
    f(2)=9*9*8,前两个9的意义同上,第三个数8是从除去前两次选择的数字,剩下的8个数字中选择一个;
    ……
    f(10)=9*9*8*7*…*1;
    f(11)=f(12)=…=0,因为拥有超过10位数的数字,至少会有其中两个位数的值是一样的;
  • 由上面的分析,若n=0,则结果result为1;
    若n=1,则result=f(1)=10;
    若n=2,则result=f(1)+f(2)=91;
    …….
    如此类推,我们需要在代码中创建两个变量,一个保存结果result,每次将当前的结果累加,另一个变量是保存f(i)的值,每次循环进行累乘获取当前的f(i)。

代码

class Solution
{
public:
    int countNumbersWithUniqueDigits(int n)
    {
        if (n == 0)
        {
            return 1;
        }

        int result = 10;
        int uniqueDigits = 9;
        for (int i = 2; i <= n && i <= 10; ++i)
        {
            uniqueDigits *= (9 - i + 2);
            result += uniqueDigits;
        }
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值