LeetCode 264

https://leetcode.cn/problems/ugly-number-ii/description/

难度:中等

高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/

定义数组 dp,其中 dp[i] 表示第 i 个丑数,第 n 个丑数即为 dp[n]。

由于最小的丑数是 1,因此 dp[1]=1。

如何得到其余的丑数呢?定义三个指针 p2,p3,p5,表示下一个丑数是当前指针指向的丑数乘以对应的质因数。初始时,三个指针的值都是 1。

当 2≤i≤n 时,令 dp[i]=min(dp[p2]×2,dp[p3]×3,dp[p5]×5),然后分别比较 dp[i] 和 dp[p2]×2,dp[p3]×3,dp[p5]×5 是否相等,如果相等则将对应的指针加 1。

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class Solution {
public:
    int nthUglyNumber(int n) {
        vector<int> f(n + 1);
        f[1] = 1;
        int p2 = 1, p3 = 1, p5 = 1;
        for (int i = 2; i <= n; i++) {
            int num2 = f[p2] * 2, num3 = f[p3] * 3, num5 = f[p5] * 5;
            f[i] = min({num2, num3, num5});
            if (f[i] == num2) {
                p2++;
            }
            if (f[i] == num3) {
                p3++;
            }
            if (f[i] == num5) {
                p5++;
            }
        }
        return f[n];
    }
};