力扣-878. 第 N 个神奇数字

本文最后更新于:2022年11月27日 晚上

题目描述

878

思路及实现

找规律

看到这种和数学沾点关系的我就喜欢嗯找规律,多举几个例子再进行数学归纳,直接拿下!
规律

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution:
def nthMagicalNumber(self, n: int, a: int, b: int) -> int:
MOD = 10 ** 9 + 7
c = lcm(a, b)
m = c // a + c // b - 1
r = n % m
res = c * (n // m) % MOD
if r == 0:
return res
addA = a
addB = b
for _ in range(r - 1):
if addA < addB:
addA += a
else:
addB += b
return (res + min(addA, addB) % MOD) % MOD

二分查找

这个二分确实不看题解没想过,榆木脑袋是这样的呜呜
二分查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution:
def nthMagicalNumber(self, n: int, a: int, b: int) -> int:
MOD = 10 ** 9 + 7
l = min(a, b)
r = n * min(a, b)
c = lcm(a, b)
while l <= r:
mid = (l + r) // 2
cnt = mid // a + mid // b - mid // c
if cnt >= n:
r = mid - 1
else:
l = mid + 1
return (r + 1) % MOD

这里有一只爱丽丝

希望本文章能够帮到您~


力扣-878. 第 N 个神奇数字
https://map1e-g.github.io/2022/11/27/leetcode-878/
作者
MaP1e-G
发布于
2022年11月27日
许可协议