问题描述

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