目录

1201:丑数 III(2039 分)

力扣第 155 场周赛第 2 题

题目

丑数是可以被 a b c 整除的 正整数

给你四个整数:nabc ,请你设计一个算法来找出第 n 个丑数。

示例 1:

输入:n = 3, a = 2, b = 3, c = 5
输出:4
解释:丑数序列为 2, 3, 4, 5, 6, 8, 9, 10... 其中第 3 个是 4。

示例 2:

输入:n = 4, a = 2, b = 3, c = 4
输出:6
解释:丑数序列为 2, 3, 4, 6, 8, 9, 10, 12... 其中第 4 个是 6。

示例 3:

输入:n = 5, a = 2, b = 11, c = 13
输出:10
解释:丑数序列为 2, 4, 6, 8, 10, 11, 12, 13... 其中第 5 个是 10。

提示:

  • 1 <= n, a, b, c <= 109
  • 1 <= a * b * c <= 1018
  • 本题结果在 [1, 2 * 109] 的范围内

分析

观察数据范围容易想到用二分查找。

令 check(x) 代表小于等于 x 的丑数个数是否大于等于 n,那么二分查找第一个满足 check(x) 的 x 即可。

具体求小于等于 x 的丑数个数,则可以用到集合的知识。

解答

1
2
3
4
5
6
def nthUglyNumber(self, n: int, a: int, b: int, c: int) -> int:
    def check(x):
        return x//a+x//b+x//c-x//lcm(a,b)-x//lcm(a,c)-x//lcm(b,c)+x//reduce(lcm, [a,b,c])>=n
    
    self.__class__.__getitem__ = lambda self, x: check(x)
    return bisect_left(self, True, 0, a*n)

40 ms