263. 丑数
只要把num中的2, 3, 5除干净即可
class Solution {
public:
bool isUgly(int n) {
if (n <= 0) return false;
while (n % 2 == 0) n /= 2;
while (n % 3 == 0) n /= 3;
while (n % 5 == 0) n /= 5;
return n == 1;
}
};
264. 丑数 II
要找到第n个丑数,我们就要知道丑数知怎么来的,丑数就是质因子只有2,3,5的数字,所以反过来想一下,一个丑数*2,3,5其中的一个或多个数就可以得到新的丑数,所以就可以将丑数归纳为 [未知丑数] 由 [已有丑数] 得来的,所以就可以分为三个丑数序列代表是 *2 *3 *5 得来的丑数序列,再将这三个序列归并成一条序列就是丑数序列,而经过n次这样的操作,序列的最后一个元素就是第n个丑数。那怎么得到这三个丑数序列呢?其实不用实际得到这三个序列,因为可以反过来想每一个序列/2 /3 /5就是原丑数序列,所以根据这两者的相互关系,每次从三个序列中取出最小的值放到答案序列中即可,就可以一边归并成答案序列,一边求要归并的序列,哈哈,这不是很神奇,来看看代码吧!!!
class Solution {
public:
int nthUglyNumber(int n) {
vector<int> res(1, 1);
int i = 0, j = 0, k = 0;
while (-- n)
{
int t = min(res[i] * 2, min(res[j] * 3, res[k] * 5));
res.push_back(t);
if (res[i] * 2 == t) i ++;
if (res[j] * 3 == t) j ++;
if (res[k] * 5 == t) k ++;
}
return res.back();
}
};
用到了多路归并的算法,S:丑数序列
S2:S * 2
S3:S * 3
S5:S * 5
上面的三个序列都是由丑数序列23*5得到的,所以还是丑数序列,S就是将三个序列归并起来就可以了
本文介绍了如何通过编程解决丑数问题,包括判断一个数是否为丑数的方法及如何找到第n个丑数。采用多路归并算法高效地生成丑数序列。
173

被折叠的 条评论
为什么被折叠?



