LeetCode 878 第N个神奇数字[二分查找] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 878 第N个神奇数字[二分查找] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
这是一道很有意思的二分查找题目,关键在于如何应用二分的思路,首先对于一个神奇数,它是第几个不仅取决于是a和b的各自多少倍,还取决于a、b最小公倍数的多少倍(n = num /a + num/b - num/c),那么我们要找到a和b的最小公倍数,然后在最小和最大范围内二分,找那个正好是第n个神奇数字,代码如下:
class Solution
public:
int gcd(int a, int b)
if(b == 0) return a;
return gcd(b, a % b);
int lcm(int a, int b)
return a / gcd(a, b) * b;
int nthMagicalNumber(int n, int a, int b)
long long l = min(a, b), r = (long long)min(a, b) * n, c = lcm(a, b);
while(l < r)
long long mid = (l + r) / 2;
mid / a + mid / b - mid / c >= n ? r = mid : l = mid + 1;
return (int)(r % (1000000007));
;
以上是关于LeetCode 878 第N个神奇数字[二分查找] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章