丑数(三十三)

题目描述

把只包含质因子 ​​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];
}
};