剑指 Offer -- 丑数(三十三)
原创
©著作权归作者所有:来自51CTO博客作者珍妮的选择的原创作品,请联系作者获取转载授权,否则将追究法律责任
丑数(三十三)
题目描述
把只包含质因子 2
、3
和 5
的数称作丑数(Ugly Number)。例如 6
、8
都是丑数,但 14
不是,因为它包含质因子 7
。 习惯上我们把 1
当做是第一个丑数。求按从小到大的顺序的第 N
个丑数。
代码(已在牛客上 AC)
使用额外的空间记录第 i
个丑数是多少, 同时引入 p1
, p2
和 p3
三个索引, 方便按从小到大的顺序求出丑数. 具体详见代码.
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if (index <= 0) return 0;
vector<int> k(index);
k[0] = 1;
int p1 = 0, p2 = 0, p3 = 0;
for (int i = 1; i < index; ++i) {
k[i] = min(min(2 * k[p1], 3 * k[p2]), 5 * k[p3]);
if (k[i] == 2 * k[p1]) p1 ++;
if (k[i] == 3 * k[p2]) p2 ++;
if (k[i] == 5 * k[p3]) p3 ++;
}
return k[index - 1];
}
};