丑数 III
难度:
标签:
题目描述
An ugly number is a positive integer that is divisible by a
, b
, or c
.
Given four integers n
, a
, b
, and c
, return the nth
ugly number.
Example 1:
Input: n = 3, a = 2, b = 3, c = 5 Output: 4 Explanation: The ugly numbers are 2, 3, 4, 5, 6, 8, 9, 10... The 3rd is 4.
Example 2:
Input: n = 4, a = 2, b = 3, c = 4 Output: 6 Explanation: The ugly numbers are 2, 3, 4, 6, 8, 9, 10, 12... The 4th is 6.
Example 3:
Input: n = 5, a = 2, b = 11, c = 13 Output: 10 Explanation: The ugly numbers are 2, 4, 6, 8, 10, 11, 12, 13... The 5th is 10.
Constraints:
1 <= n, a, b, c <= 109
1 <= a * b * c <= 1018
- It is guaranteed that the result will be in range
[1, 2 * 109]
.
代码结果
运行时间: 22 ms, 内存: 16.1 MB
解释
方法:
该题解使用了最小公倍数(Least Common Multiple, LCM)和二分查找的策略。首先,计算a, b, c两两之间以及三者的最小公倍数(ab, ac, bc, abc)。定义一个函数f(k)来计算小于或等于k的丑数数量,这是通过包含-排除原理计算得出的:单独计算k能被a, b, c整除的数的数量,减去k能被ab, ac, bc整除的数的数量。通过这个函数,可以快速计算出任意数k下的丑数数量。接着,使用二分查找方法在有效范围内搜索第n个丑数。首先通过abc整除周期估计位置,然后在周期内精确搜索。
时间复杂度:
O(log(abc))
空间复杂度:
O(1)
代码细节讲解
🦆
为什么在计算小于或等于k的丑数数量时,需要单独计算k能被a, b, c整除的数的数量,然后再减去k能被ab, ac, bc整除的数的数量?
▷🦆
如何确保二分查找在寻找第n个丑数时的正确性,特别是在处理边界条件如周期末尾或开始时?
▷🦆
在实现二分查找的时候,你是如何选择二分查找的起始和结束点的,为什么选择这个范围?
▷