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

357. Count Numbers with Unique Digitsgit


Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n.app

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

Hint:spa

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

  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.orm

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

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

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

題目大意:io

找出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位,因此確定有重複的數字。


代碼以下:

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

相關文章
相關標籤/搜索