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
相关文章
|
7月前
|
算法 搜索推荐 Java
【经典算法】LeetCode 215. 数组中的第K个最大元素(Java/C/Python3实现含注释说明,Medium)
【经典算法】LeetCode 215. 数组中的第K个最大元素(Java/C/Python3实现含注释说明,Medium)
89 3
|
7月前
|
存储 算法 Java
【经典算法】LeetCode 5: 最长回文子串(Java/C/Python3实现含注释说明,Medium)
【经典算法】LeetCode 5: 最长回文子串(Java/C/Python3实现含注释说明,Medium)
88 2
|
7月前
|
存储 缓存 算法
【经典算法】LeetCode 1143:最长公共子序列Java/C/Python3实现含注释说明,Medium)
【经典算法】LeetCode 1143:最长公共子序列Java/C/Python3实现含注释说明,Medium)
32 1
|
存储 C++ Python
LeetCode刷题---Add Two Numbers(一)
LeetCode刷题---Add Two Numbers(一)
|
存储 算法 安全
LeetCode - #2 Add Two Numbers
我们社区从本期开始会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。
LeetCode - #2 Add Two Numbers
|
算法 测试技术
LeetCode 周赛 333,你管这叫 Medium 难度?
大家好,我是小彭。 上周是 LeetCode 第 333 场周赛,你参加了吗?这场周赛质量很高,但难度标得不对,我真的会谢。算法解题思维需要长时间锻炼,加入我们一起刷题吧~
117 0
LeetCode 357. Count Numbers with Unique Digits
给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10n 。
93 0
LeetCode 357. Count Numbers with Unique Digits
LeetCode contest 200 5475. 统计好三元组 Count Good Triplets
LeetCode contest 200 5475. 统计好三元组 Count Good Triplets
LeetCode 1380. 矩阵中的幸运数 Lucky Numbers in a Matrix
LeetCode 1380. 矩阵中的幸运数 Lucky Numbers in a Matrix
LeetCode Contest 178-1365. 有多少小于当前数字的数字 How Many Numbers Are Smaller Than the Current Number
LeetCode Contest 178-1365. 有多少小于当前数字的数字 How Many Numbers Are Smaller Than the Current Number