题目:
题解:
- 二分法
- 小于等于数值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;
}
};
algsup
发布了487 篇原创文章 · 获赞 151 · 访问量 11万+
关注