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