丑数

把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。

习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

可能刚开始没看懂题意,这里解释一下

1是丑数,然后是质因数为2,3,5的数

就是说4是两个丑数2相乘得到的一个丑数

6是2*3的到的丑数

8是2*4得到的丑数

就是说丑数是由前面的一个丑数乘以2或3或5得到的

题解:如何得到前一个丑数那,

存放丑数数组res,res数组里的第一个元素为1。因为我们要让丑数数列有序,所以要每次使这三个因子组成的最小的数进入数组。

t2表示乘以2得到的丑数,t3表示乘以3得到的丑数,t5是乘以5得到的丑数, 

把最小的进入丑数数组res

res: 1

t2: 2
t3: 3
t5: 5
比较(2,3,5)->min_n = 2,   2进入 res

 

 res:1 2

t 2:   4
t 3:   3 6
t 5:   5 10

然后比较当前的值(4,3,5),3再进入res

res 1 2 3

t 2:   4
t 3:   6 9
t 5:   5 10

(4, 5, 6)  得到4进入res

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        // 1--6都是丑数
        if(index < 7)
            return index;

        vector<int>res(index);
        res[0] = 1;
        // t2 就是乘以2的丑数,t3就是乘以3的丑数,t5就是乘以5的丑数
        int t2 = 0, t3 = 0, t5 = 0;
        for(int i = 1; i < index; i++)
        {
            // 三个丑数中选取最小的(2,3,5) 作为下一个丑数
            res[i] = min(res[t2]*2, min(res[t3]*3, res[t5]*5));

            if(res[i] == res[t2] * 2)  t2++;
            if(res[i] == res[t3] * 3)  t3++;
            if(res[i] == res[t5] * 5)  t5++;
        }
        return res[index-1];
    }
};

https://blog.csdn.net/qq_38790716/article/details/89052721

原文地址:https://www.cnblogs.com/xiaokang01/p/12517916.html