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之路的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 0878. 第 N 个神奇数字

二分查找边界问题

leetcode - 二分查找

leetcode - 二分查找

二分法

[二分查找] 乘法表中第k小的数