• 357. Count Numbers with Unique Digits


    问题

    给定一个非负整数n,数一下在0<=x<10^n之间有多少个数是unique digit(每个位数都不相同)

    Input: 2
    Output: 91
    Explanation: 0-99有100个数,去除9个位数相同的值{11,22,33,44,55,66,77,88,99}。100-9=91。

    思路

    零位数1个,一位数9个,两位数81个,对于三位以及三位以上的数,我们看看填数有多少种填法。

    先填最高位,除了0都可以填,因此有1-9可以填,有9种可能。
    再填次高位,这个时候可以填0,0-9里面除了最高位已经填了的值,其它都能填,同样有9种可能。
    后面的位就按8,7,6,5,4,3,2,1下降,因为每填一位,后面可以填的数就少一位。

    把一位数到n位数的可能性都相加,即最终结果。

    可以用dp利用前面计算过的结果,dp[i]表示i位数有几个。
    dp[0] = 1
    dp[1] = dp[0] + 9 = 10
    dp[2] = dp[1] + 9*9 = 91
    dp[3] = dp[2] + 9*9*8
    dp[4] = dp[3] + 9*9*8*7
    ...
    dp[i] = dp[i-1] + (dp[i-1] - dp[i-2]) * (11-i), where i >= 3

    时间复杂度O(n),空间复杂度O(1)

    代码

    class Solution(object):
        def countNumbersWithUniqueDigits(self, n):
            """
            :type n: int
            :rtype: int
            """
            if(n == 0): return 1
            if(n == 1): return 10
            if(n == 2): return 91
            dp1 = 91
            dp2 = 10
            for i in range(3,n+1):
                dp1, dp2 = dp1 + (dp1-dp2)*(11-i), dp1
            return dp1
    
  • 相关阅读:
    js中级-函数封装
    js中级-11.7
    js中级-11.5
    js中级-11.2
    js中级-this
    js中级-作用域链
    10.23
    10.22
    10.19js
    10.18
  • 原文地址:https://www.cnblogs.com/liaohuiqiang/p/9764744.html
Copyright © 2020-2023  润新知