LC 6151. 统计特殊整数
https://leetcode.cn/problems/count-special-integers/
其实我觉得这题可以枚举所有数字的可能性,但是好像这题时间卡的比较紧,所以需要一些优化实现
如果是位数如果不够的话,那么可以使用组合计数的方式计算出来可能性
- 假设有X位
- 第一位可能性是[1-9]9种可能性
- 之后位数可能性则是A(9, X-1)
然后考虑位数相同的情况,这个就需要做些搜索了,假设这个数字表示是 x0,x1,x2..xi,..xn-1
- 对于第一位如果值是[1,x0-1]的话,那么之后位数肯定是满足的,就有 x0 * A(9, n-1) 种可能
- 如果第一位是x0的话,那么同理考虑第二位。但是考虑第二位的时候需要将x0排除,以此类推。
- 如果所有位数都符合的话,那么就是相等的情况,就需要返回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