leetCode 357. Count Numbers with Unique Digits | Dynamic Programming | Medium

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

Hint:

  1. A direct way is to use the backtracking approach.

  2. Backtracking should contains three states which are (the current number, number of steps to get that number and a bitmask which represent which number is marked as visited so far in the current number). Start with state (0,0,0) and count all valid number till we reach number of steps equals to 10n.

  3. This problem can also be solved using a dynamic programming approach and some knowledge of combinatorics.

  4. Let f(k) = count of numbers with unique digits with length equals k.

  5. f(1) = 10, ..., f(k) = 9 * 9 * 8 * ... (9 - k + 2) [The first factor is 9 because a number cannot start with 0].

题目大意:

找出10的n次方内,没有重复数字的数的个数。例如10的3次方内,102为合法值,101为非法值。

思路:

采用排列组合来求出10的i次方,比如10的平方,范围为[1,100),然后找出这个范围内合法值有几个。9*9(第一位不能为0,所以为9,第二位可以为除了第一位以外的9中情况)。

n次方范围合法个数
0[0,1)1
1[1,10)
9
2[10,100)9*9
3
[100,1000)9*9*8
.........
i(i<9)
[10的i-1次方,10的i次方)9*9*8*7*...*(9 - n + 2)
9
[100000000,1000000000)9*9*8*7*6*5*4*3*2

经过上面分析,当n大于等于10的时候,合法值不再增加,因为n>=10时,数的位数超过了10位,所以肯定有重复的数字。


代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class  Solution {
public :
     int  countNumbersWithUniqueDigits( int  n) {
         int  result,tmp;
         if (0 == n)
             return  1;
         if (1 == n)
             return  10;
         result = 10;
         tmp = 9;
         for ( int  i = 2; i<=min(n,9); ++i)
         {
             result += tmp * (11 - i);
             tmp *= (11 - i);
         }
         
         return  result;
     }
};



本文转自313119992 51CTO博客,原文链接:http://blog.51cto.com/qiaopeng688/1845316
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值