[二分法]leetcode1201:丑数 Ⅲ (medium)

题目:
[二分法]leetcode1201:丑数 Ⅲ (medium)
题解:

  • 二分法
  • 小于等于数值n的丑数个数为:n/a+n/b+n/c-n/ab的最小公倍数-n/ac的最小公倍数-n/bc的最小公倍数+n/三者的最小公倍数。因此我们先求出ab、ac、bc、abc的最小公倍数,由于C++17已经将两个整数最小公倍数函数lcm(a,b)加入标准库中,所以我们可以很方便的调用这个函数就好了,当然也可以自己实现。

代码如下:

class Solution {
public:
    //二分法:寻找大于等于x的最小值,套用lower_bound模板即可
    int nthUglyNumber(int n, int a, int b, int c) {
        long ab=lcm<long>(a,b),ac=lcm<long>(a,c),bc=lcm<long>(b,c),abc=lcm<long>(ab,c);
        int left=0,right=INT_MAX;
        while(left<right){
            int mid=left+((right-left)>>1);
            //小于等于某个整数n的丑数个数:n/a+n/b+n/c-n/ab的最小公倍数-n/ac的最小公倍数-n/bc的最小公倍数+n/三者的最小公倍数
            int count=mid/a+mid/b+mid/c-mid/ab-mid/ac-mid/bc+mid/abc;
            if(count>=n)right=mid;
            else left=mid+1;
        }
        return left;
    }
};
[二分法]leetcode1201:丑数 Ⅲ (medium)[二分法]leetcode1201:丑数 Ⅲ (medium) algsup 发布了487 篇原创文章 · 获赞 151 · 访问量 11万+ 他的留言板 关注
上一篇:【leetcode】【medium】216. Combination Sum III​​​​​​​


下一篇:Java分布式:消息队列(Message Queue)