统计特殊整数 2376
如果一个正整数每一个数位都是 互不相同 的,我们称它是 特殊整数 。
给你一个 正 整数 n
,请你返回区间 [1, n]
之间特殊整数的数目。
示例 1:
输入: n = 20
输出: 19
解释: 1 到 20 之间所有整数除了 11 以外都是特殊整数。所以总共有 19 个特殊整数。
示例 2:
输入: n = 5
输出: 5
解释: 1 到 5 所有整数都是特殊整数。
示例 3:
输入: n = 135
输出: 110
解释: 从 1 到 135 总共有 110 个整数是特殊整数。
不特殊的部分数字为:22 ,114 和 131 。
提示:
分析与解答#
直觉上,感觉可以分为构造和检查两种思路。看看能不能找到出现的规律。检查好像比较勉强。
如果真的就是暴力检查,那么复杂度大概就是 10^10
,先试试再说。利用set检查重复:
不出意料的超时了。
直接排列组合还是比较抽象的。n
最大是 2000000000,那么最多有10位。我们按数字位数来考虑。我们先思考最大有多少。
对于k位数,需要k个数字。第一位不为0,那么选择是9⋅9⋯(11−k)。全部加起来:
最后一行是10位数的情况,因为第一位只能是1。这样计算的就是最大范围内的特殊整数个数。接下来就是考虑什么时候停止了。
如果n是k位数,那么我们可以考虑从1位数到k-1位数的特殊整数个数。可以直接计算。对于k位,第一位(这里从左到右)必须不比n大。
考虑相等和不相等。如果不相当,后面就是全排列了。如果相等,那就动态的往后考虑。
主要是注意检查一下n本身是不是特殊整数。两个vector都是用来避免反复求组合数的,其实实际用处不大。
题目不难,但是组合数算错检查了半天。。开始质疑我的代码能力了。