美文网首页动态规划动态规划
357. Count Numbers with Unique D

357. Count Numbers with Unique D

作者: Nancyberry | 来源:发表于2018-05-27 06:45 被阅读0次

    Description

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

    Credits:
    Special thanks to @memoryless for adding this problem and creating all test cases.

    Solution

    Mathematics & DP, O(n), S(1)

    这道题的目的是构造不超过n位的数字val,使得val中每位都是unique的。其实就是数学概率题啊,也可以用DP解决。
    首先需要注意一点的是,第一位选择0怎么办,这样数字就会不足n位。其实只要按照数字位数digits增长,从1到n讨论就行了,这样就能保证第一个digit不选择0。

    用dp[i]代表i个digits对应的unique digits num个数。那么:

    • dp[0] = 1; // 0
    • dp[1] = dp[0] * 9 // [1, 9]
    • dp[i] = dp[i - 1] * (10 - (i - 1)) = dp[i - 1] * (11 - i) // select a digit from [0, 9], except digits used in dp[i - 1]
    class Solution {
        public int countNumbersWithUniqueDigits(int n) {
            if (n < 0) {
                return 0;
            }
            
            int prev = 1;
            int sum = 1;
            
            for (int i = 1; i <= n && prev > 0; ++i) {
                if (i == 1) {
                    prev *= 9;
                } else {
                    prev *= 11 - i;
                }
                
                sum += prev;
            }
            
            return sum;
        }
    }
    

    相关文章

      网友评论

        本文标题:357. Count Numbers with Unique D

        本文链接:https://www.haomeiwen.com/subject/xlovjftx.html