Count Numbers with Unique Digits

本文介绍了一种高效算法,用于计算指定范围内所有不含重复数字的整数总数。通过递归和排列组合的方法解决了LeetCode上的一个问题,并给出了清晰的实现思路及C++代码示例。

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

题目

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

分析

这个问题在leetcode中被归类为动态规划,但其实它也可以说归类为分治算法。根据题意,我们需要求0~10n之间满足每位数字都不相同的数的总个数。

当0 < n <= 10,转化为子问题,假设我们已知0~10n-1之间满足条件的总个数设为f(n-1),则f(n)=f(n-1)+P(10,n)-P(9,n-1),其中P指排列数。

当n = 0时,返回值为1

当n > 10时,返回值为0

代码

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值