leetCode 357. Count Numbers with Unique Digits | Dynamic Programming | Medium
2016-09-01 18:45
471 查看
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
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.
This problem can also be solved using a dynamic programming approach and some knowledge of combinatorics.
Let f(k) = count of numbers with unique digits with length equals k.
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大于等于10的时候,合法值不再增加,因为n>=10时,数的位数超过了10位,所以肯定有重复的数字。
代码如下:
2016-09-01 18:45:28
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:A direct way is to use the backtracking approach.
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.
This problem can also be solved using a dynamic programming approach and some knowledge of combinatorics.
Let f(k) = count of numbers with unique digits with length equals k.
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 |
代码如下:
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; } };
2016-09-01 18:45:28
相关文章推荐
- Leetcode 255. Verify Preorder Sequence in Binary Search Tree (Medium) (cpp)
- 【LeetCode】228.Summary Ranges(Medium)解题报告
- LeetCode第三关:Longest Substring Without Repeating Characters --> Difficulty: Medium
- LeetCode解题报告 241. Different Ways to Add Parentheses [medium]
- Leetcode 96. Unique Binary Search Trees[medium]
- 【LeetCode】109.Convert Sorted List to Binary Search Tree(Medium)解题报告
- LeetCode刷题(C++)——3Sum Closest(Medium)
- LeetCode-69-Sqrt(x)(二分法)-Medium
- Leetcode 94. Binary Tree Inorder Traversal (Medium) (cpp)
- 【LeetCode】228.Summary Ranges(Medium)解题报告
- 【Leetcode】【Medium】Letter Combinations of a Phone Number
- LeetCode 712. Minimum ASCII Delete Sum for Two Strings [Medium]
- Leetcode 384. Shuffle an Array (Medium) (cpp)
- 【LeetCode】(113)Path Sum II(Medium)
- Leetcode 240. Search a 2D Matrix II (Medium) (cpp)
- Leetcode 397. Integer Replacement[medium]
- Leetcode 275. H-Index II (Medium) (cpp)
- LeetCode的medium题集合(C++实现)九
- 151.leetcode Reverse Words in a String(medium)[字符串分词翻转]
- LeetCode解题报告 279. Perfect Squares [medium]