题目描述

把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

解题思路

安排3个队列分别存放 ×2、×3、×5的数,为什么这么做?因为我们需要每次从三个队列中的头部取出其中最小的值,然后将这个值再分别×2、×3、×5存放到那三个队列的尾部,这会使得这三个队列是有序的(从小到大)。
初始化:
q_2 = [1, ]
q_3 = [1, ]
q_5 = [1, ]
第一轮:
res = 1 (将三个队列的头部为1的都弹出)
q_2 = [1×2, ]
q_3 = [1×3, ]
q_5 = [1×5, ]
第二轮:
res = 2 (将三个队列的头部为2的都弹出)
q_2 = [2×2, ]
q_3 = [1×3, 2×3, ]
q_5 = [1×5, 2×5, ]
第三轮:
res = 3 (将三个队列的头部为3的都弹出)
q_2 = [2×2, 3×2, ]
q_3 = [2×3, 3×3, ]
q_5 = [1×5, 2×5, 3×5, ]
......

class Solution {
public:
    int GetUglyNumber_Solution(int index) {

        queue<int> q_2,q_3,q_5;
        int res=0;    //index=0时,需要返回0

        //初始化,将 1 push 到3个对列里
        q_2.push(1);
        q_3.push(1);
        q_5.push(1);

        for(int i=0;i<index;i++)
        {
            //选取三个队列头部最小的值
            res = min(q_2.front(),min(q_3.front(),q_5.front()));

            //分别将res ×2, ×3, ×5 放到三个队列中
            q_2.push(res*2);
            q_3.push(res*3);
            q_5.push(res*5);

            //弹出三个队列的头部为res的数
            if(q_2.front()==res)
                q_2.pop();
            if(q_3.front()==res)
                q_3.pop();
            if(q_5.front()==res)
                q_5.pop();

        }
        return res;
    }
};