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
posted @ 2018-10-10 10:08  PilgrimHui  阅读(302)  评论(0编辑  收藏  举报