zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    解决Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile
    eclipse下解决明明有jar包,却找不到的问题
    Ngnix负载均衡安装及配置
    Redis入门教程(二)
    js监听组合按键
    js清空数组的方法
    js判断浏览器是否支持webGL
    Maven入门教程(一)
    杂记
    第一天 Requests库入门
  • 原文地址:https://www.cnblogs.com/liaohuiqiang/p/9764744.html
Copyright © 2011-2022 走看看