题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
题目分析
丑数的定义是含有的质因子是1或者因子只有2 3 5,由此可推出丑数的构造规律:
丑数=丑数 x 丑数,假设丑数有序序列为:a1,a2,a3…an
所以可以将以上序列(a1除外)可以分成3类,必定满足:
包含2的有序丑数序列:2a1, 2a2, 2a3 …
包含3的有序丑数序列:3a1, 3a2, 3a3 …
包含5的有序丑数序列:5a1, 5a2, 5*a3 …
以上3个序列的个数总数和为n个,而且已知a1 = 1了,将以上三个序列合并成一个有序序列即可 。
程序中的t2,t3,t5是合并过程中三个序列中带排序的字段的下标索引。
核心思想是把每一次的丑数当成已知,求下一个丑数,直到目标丑数的出现。
详情请见代码注释。
代码
C++代码如下:
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if(index<7) //1-6全是丑数
return index;
vector<int> num(index);
num[0]=1;
int t2=0,t3=0,t5=0;
for(int i=1;i<index;i++)
{
//每个丑数分别乘以2,3,5得出新的丑数,新得到的丑数的质因子只有2,3,5
num[i]=min(num[t2]*2,min(num[t3]*3,num[t5]*5));
//生成新的丑数保证不会重复
if(num[i]==num[t2]*2)t2++;
if(num[i]==num[t3]*3)t3++;
if(num[i]==num[t5]*5)t5++;
}
return num[index-1];
}
};