leetcode 퀴즈

1568 단어 leetcode
leetcode357Count 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]
예를 들어 n=3, 우리가 구한 것은 0-999 사이에 얼마나 유일무이한 숫자가 있는지이다.우리는 100에서 999 사이에 얼마나 많은 유일무이한 숫자가 있는지 분리해서 0에서 99의 결과를 더하면 된다.같은 이치로 0-99를 구하고, 먼저 10-99를 구한 다음에 0-9의 결과를 더하면, 우리는 이미 0-9의 결과가 10이라는 것을 알고 있기 때문에 10-99만 요구하면 된다.먼저 첫 번째 숫자를 보면 수치를 얻을 수 있는 범위는 1-9로 모두 9가지가 가능하다. 두 번째 숫자의 수치를 얻을 수 있는 범위는 0-9이고 이론적으로 10개의 수를 얻을 수 있지만 첫 번째 숫자와 중복되는 상황을 고려하면 9개만 얻을 수 있기 때문에 10-99 사이의 유일한 숫자는 9x9=81개이다.이제 100-999 사이를 돌아보면 10-99를 토대로 바로 3위 숫자를 보면 0-9, 앞의 두 자리 숫자가 중복될 수 있기 때문에 8개만 뽑을 수 있기 때문에 100-999 사이의 유일무이한 숫자는 81 X 8 = 648개에 불과할 것이다. 여기에 앞의 0-99 사이의 개수를 더하면 0-999 사이의 유일무이한 숫자는 648 + 81 + 10 = 739개이다.순서대로 유추하면 3을 초기값으로 하고 n에 한 자리를 더 추가하면 이 위치에서 선택할 수 있는 숫자의 개수는 -1이고 코드는 다음과 같다.
class Solution {
public:
    int countNumbersWithUniqueDigits(int n) {
        if (n == 0)
        {
            return 1;
        }
        if (n == 1)
        {
            return 10;
        }
        
        vector dp(n + 1, 0);
        
        dp[2] = 91;
        
        for (int i = 3; i < n + 1; ++i)
        {
            int sum = 81;
            for (int j = 3; j <= i; ++j)
            {
                sum *= (11 - j);
            }
            
            dp[i] = sum + dp[i - 1];
        }
        
        return dp[n];
    }
};

좋은 웹페이지 즐겨찾기