Leetcode 357.统计各位数字的不同个数

这篇博客探讨了LeetCode第357题的解决方案,主要涉及两种方法:组合数学和数位动态规划。在组合数学方法中,通过列出不同n值下的数量规律,得出当n>=2时的公式为9*A9^(d-1)。而在数位DP解法中,博主详细解释了如何利用动态规划来计算具有唯一数字的整数的数量。代码实现使用C++,时间复杂度为O(n),空间复杂度为O(1)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接:Leetcode 357. Count Numbers with Unique Digits

Given an integer n, return the count of all numbers with unique digits : x, where 0 <= x < 10n.

Example 1:

Input: n = 2
Output: 91
Explanation: The answer should be the total numbers in the range of 0 ≤ x < 100, excluding 11,22,33,44,55,66,77,88,99

Example 2:

Input: n = 0
Output: 1

Constraints:

  • 0 <= n <= 8


解法一:组合数学

思路:

首先可以罗列一下n取不同值的情况:

  • 0 对应 1(x只能为1)
  • 1 对应 10(x可以取0~9)
  • 2 对应 9 * 9(第一位排除先导0可以取9种情况,第二位和第一位不同,可以取9种情况)
  • 3 对应 9 * 9 * 8(前两位和上面相同,第三位要排除前两位取得情况)
  • 4 对应 9 * 9 * 8 * 7(以此类推)
  • 5 对应 9 * 9 * 8 * 7 * 6
  • 6 对应 9 * 9 * 8 * 7 * 6 * 5
  • 7 对应 9 * 9 * 8 * 7 * 6 * 5 * 4
  • 8 对应 9 * 9 * 8 * 7 * 6 * 5 * 4 * 3

对于n>=2的情况,还要再加上n=1时候的十种才是正确的答案
因此当n>=2时,有公式:

a n s = 9 ∗ A 9 d − 1 ans = 9 * A_{9}^{d-1} ans=9A9d1

c++代码:

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

        int ans = 10, cur = 9;
        // 从第二位开始
        for (int i = 2; i <= n; ++i) {
            cur *= 9 - i + 2;
            ans += cur;
        }
        return ans;

    }
};

复杂度分析:

  • 时间复杂度:O(n),一趟循环
  • 空间复杂度:O(1)


解法二:数位DP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值