问题描述
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
算法分析
每个位置上的丑数都是某个丑数乘上2或3或5的结果,看如下示例:
第1个丑数是 1,
第2个丑数是 1 * 2 = 2, 第1个丑数*2
第3个丑数是 1 * 3 = 3, 第1个丑数*3
第4个丑数是 2 * 2 = 4, 第2个丑数*2
第5个丑数是 1 * 5 = 5, 第1个丑数*5
第6个丑数是 2 * 3 = 6, 第2个丑数*3
。。。。。
我们以w2,w3,w5分别记录为2、3、5出现的位置,初始都为0,设丑数序列为A
最开始我们也只有丑数1,
第2个丑数为min(A[w2]*2 , A[w3]*3, A[w5]*5),然后最小值为A[w2]*2,所以w2可以向后移一位,这样下一次就是计算第2个丑数乘以2,
从而保证了丑数序列的不断递增,直到找到第index丑数。
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if (index == 1) return 1;
int* x = new int[index];
x[0] = 1;
int w2 = 0, w3 = 0, w5 = 0;
for (int i = 1, j = 1; i < index; i++){
int tmp2 = x[w2] * 2;
int tmp3 = x[w3] * 3;
int tmp5 = x[w5] * 5;
int t = min(tmp2, min(tmp3, tmp5));
if (t == tmp2) w2++;
if (t == tmp3) w3++;
if (t == tmp5) w5++;
x[i] = t;
}
return x[index - 1];
}
};