1.题目
把只包含质因子2、3、5
的数称作丑数(Ugly Number)
。例如6、8
都是丑数,但14
不是,因为它包含质因子7
。习惯上我们把1
当做是第一个丑数。求按从小到大的顺序的第N
个丑数。
2.我的题解
丑数具有以下性质:
- 仅包含因子
2,3,5
,即 N = 2 x ∗ 3 y ∗ 5 z ( x , y , z = 0 , 1 , 2 , 3 ⋯ ) N=2^x *3^y *5^z (x,y,z=0,1,2,3\cdots) N=2x∗3y∗5z(x,y,z=0,1,2,3⋯); - 一个丑数可以由之前的丑数乘以
2,3,5
得到; - 从队首元素
1
开始,维护三个队列,三个队列下一个元素(先计算,但无需添加)的计算方式分别是乘以2,3,5
;但三个队列不是每次都要添加新元素的,仅是下一个元素被选中为下一个丑数的那些队列需要添加进队列。 - 可以将三个队列合为一个,选用三个指针记录位置,指针指向最小的乘以
2(3,5)
将超出队尾元素的元素;如果指针处的数乘2(3,5)
之后被选为下一个丑数,那么指针右移一位。
队列1 | 队列2 | 队列3 | 丑数 | 1个队列的形式 |
---|---|---|---|---|
1 | 1 | 1 | 1 | 1 p2 p3 p5 |
1,2 | 1,(3) | 1,(5) | 2 | 1, 2 p3 p5 __p2 |
1,2,(4) | 1,3 | 1,(5) | 3 | 1, 2, 3 p5 __p2 ____p3 |
1,2,4 | 1,3,(9) | 1,(5) | 4 | 1, 2, 3, 4 p5 ____p3 ______p2 |
1,2,4,(8) | 1,3,(9) | 1,5 | 5 | 1, 2, 3, 4, 5 ________p5 ____p3 ______p2 |
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if(index<=0)return 0;
int num2=0,num3=0,num5=0;
vector<int> res(index);
res[0]=1;
for(int i=1;i<index;i++){
res[i]=min(min(res[num2]*2,res[num3]*3),res[num5]*5);
if(res[i]==res[num2]*2)num2++;
if(res[i]==res[num3]*3)num3++;
if(res[i]==res[num5]*5)num5++;
}
return res[index-1];
}
};
或者
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if(index<=0)return 0;
int num2=0,num3=0,num5=0;
vector<int> res(index);
res[0]=1;
for(int i=1;i<index;i++){
res[i]=min(min(res[num2]*2,res[num3]*3),res[num5]*5);
if(res[i]%2==0)num2++;
if(res[i]%3==0)num3++;
if(res[i]%5==0)num5++;
}
return res[index-1];
}
};