美文网首页动态规划动态规划
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