LC 6151. 统计特殊整数

https://leetcode.cn/problems/count-special-integers/

其实我觉得这题可以枚举所有数字的可能性,但是好像这题时间卡的比较紧,所以需要一些优化实现

如果是位数如果不够的话,那么可以使用组合计数的方式计算出来可能性

然后考虑位数相同的情况,这个就需要做些搜索了,假设这个数字表示是 x0,x1,x2..xi,..xn-1

class Solution:
    def countSpecialNumbers(self, n: int) -> int:

        def A(n, m):
            r = 1
            for x in range(n - m + 1, n + 1):
                r *= x
            return r

        digit = 1
        ans = 0
        while 10 ** digit <= n:
            ans += 9 * A(9, digit - 1)
            digit += 1

        seq = []
        x = n
        while x:
            seq.append(x % 10)
            x = x // 10
        seq = seq[::-1]
        mask = [0] * 10

        def search(i, seq, mask):
            if i == len(seq): return 1
            r = 0
            start = 1 if i == 0 else 0
            for x in range(start, seq[i]):
                if mask[x] == 1: continue
                r += A(9 - i, len(seq) - i - 1)

            if mask[seq[i]] == 0:
                mask[seq[i]] = 1
                r += search(i + 1, seq, mask)
            return r

        ans += search(0, seq, mask)

        return ans