902.最大为 N 的数字组合
【LetMeFly】902.最大为 N 的数字组合「抽象出了函数,看着较为明白的代码 + 手推」
力扣题目链接:https://leetcode.cn/problems/numbers-at-most-n-given-digit-set/
给定一个按 非递减顺序 排列的数字数组 digits
。你可以用任意次数 digits[i]
来写的数字。例如,如果 digits = ['1','3','5']
,我们可以写数字,如 '13'
, '551'
, 和 '1351315'
。
返回 可以生成的小于或等于给定整数 n
的正整数的个数 。
示例 1:
输入:digits = ["1","3","5","7"], n = 100 输出:20 解释: 可写出的 20 个数字是: 1, 3, 5, 7, 11, 13, 15, 17, 31, 33, 35, 37, 51, 53, 55, 57, 71, 73, 75, 77.
示例 2:
输入:digits = ["1","4","9"], n = 1000000000 输出:29523 解释: 我们可以写 3 个一位数字,9 个两位数字,27 个三位数字, 81 个四位数字,243 个五位数字,729 个六位数字, 2187 个七位数字,6561 个八位数字和 19683 个九位数字。 总共,可以使用D中的数字写出 29523 个整数。
示例 3:
输入:digits = ["7"], n = 8 输出:1
提示:
1 <= digits.length <= 9
digits[i].length == 1
digits[i]
是从'1'
到'9'
的数digits
中的所有值都 不同digits
按 非递减顺序 排列1 <= n <= 109
方法一:排列组合 + 动态规划
有两种数字小于
- 数字位数直接小于
的 - 数字位数和
相同,但仍然小于
长度短的数字
对于第一种情况,假设
假设候选数字
- 个位数有
个 - 两位数有
个 - 三位数有
个
所有的三位数有
长度和 相等的数字
假设
怎么计算长度为
这里可以借助动态规划的思想,用两个变量
说人话就是:假如当前遍历到了
那么
最终遍历完
- 首先看
的前 位 :- 小于
的 位数有一个( ),因此 - 等于
的 位数有一个( ),因此
- 小于
- 接着看
的前 位 :- 小于
的 位数有 个( ,小于 的包括第一位就小于6,这一位任意
和第一位等于6,这一位必须小于3
,而小于 的数有 个),因此 - 等于
的 位数有 个( ,等于 的方案数为 ),因此
- 小于
- 最后看
的前 位 :- 小于
的 位数有 个( ,而小于 的数有 个),因此 - 等于
的 位数有 个( ),因此
- 小于
因此小于等于
(加上一位数[2, 6, 7]
组成的小于等于
- 时间复杂度
。前面求“短数字”的时间复杂度是 ,后面求“等长数字”的时间复杂度是 (这里题目中说 是升序的,因此还可以实用二分查找,但是数据量不大,因此不是很有必要) - 空间复杂度
AC代码
C++
1 |
|
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/127385999
902.最大为 N 的数字组合
https://blog.letmefly.xyz/2022/10/18/LeetCode 0902.最大为N的数字组合/