丑数(因子只有 2 3 5 的数)



理解题意关键

如果说一个数的因子只有 2 3 5 , 那么反过来想,这个数一定是由若干个 2 3 5 相乘得到的,所以每一次只需要找出当前所有已知丑数中由2 3 5 相乘可以得到的最小的数即可。
也就是说每一个丑数,都可以由之前的丑数乘 2/3/5 得到。


具体做法

设置三个指针,初始他们都指向第一个丑数(1),每一次由 2 3 5 分别与它们指针指向的位置的元素相乘,取出最小的那一个作为下一个丑数。

丑数

我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
示例

输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。

说明
1.1是丑数
2.n不超过1690

//这里的代码借鉴了leetcode评论区中一位大佬的代码
//在三个数中取最小值上,以及对不同指针运算出相同最小值的去重上都处理的相当精妙
class Solution {
public:
    int nthUglyNumber(int n) {
        vector dp(n+1);
        dp[1]= 1;
        int p1 = 1,p2 = 1,p3 = 1;
        for(int i=2;i<=n;i++){
            int num1 = dp[p1]*2,num2 = dp[p2]*3,num3 = dp[p3]*5;
            dp[i] = min(min(num1,num2),num3); //三个数取最小值
            //最后三个指针都判断一下是否取到了自己的值,如果取到了就移动,
            //相对于我之前判断取出了哪一个指针,这样可以简单的处理相同运算结果去重问题
            if(dp[i] == num1) p1++;
            if(dp[i] == num2) p2++;
            if(dp[i] == num3) p3++;
        }
        return dp[n];
    }
};