AcWing 62 丑数
发布日期:2021-05-28 16:30:49 浏览次数:30 分类:精选文章

本文共 1155 字,大约阅读时间需要 3 分钟。

为了解决丑数问题,我们可以使用三指针法,高效地找到第n个丑数。丑数是2、3和5的幂次乘积,因此可以通过归并排序的方式,逐步生成最小的丑数。

方法思路

丑数可以看作三个等差数列(被2、3、5分别整除的数)的并集。为了生成丑数,我们可以使用一个贪心算法,每次取三个数列中最小的数,并将其加入结果集中。具体步骤如下:

  • 初始化一个向量q,存储已生成的丑数,初始值为1。
  • 使用三个指针分别跟踪3个数列中的当前位置。
  • 在每次循环中,计算三个数列中当前的最小值。
  • 将这个最小值加入向量q中,并根据情况移动对应的指针。
  • 重复上述步骤直到生成第n个丑数。
  • 这种方法的时间复杂度是O(n),因为每次循环只需比较三个数,较为高效。

    解决代码

    #include 
    #include
    class Solution { std::vector
    q; int i = 0, j = 0, k = 0; public: int getUglyNumber(int n) { q.push_back(1); // 初始丑数是1 while (q.size() < n) { int t1 = q[i] * 2; int t2 = q[j] * 3; int t3 = q[k] * 5; int t = std::min(t1, t2, t3); q.push_back(t); if (t == t1) { i++; } else if (t == t2) { j++; } else if (t == t3) { k++; } } return q.back(); }};

    代码解释

  • 初始化:向量q初始化为1,作为起始的丑数。
  • 循环生成丑数:在每次循环中,计算三个数列中的最小值(t1, t2, t3),然后将其加入向量q
  • 移动指针:根据当前生成的数判断来源(2、3、5的数列),并更新相应的指针。
  • 返回结果:当生成到第n个丑数时,返回向量q中的最后一个元素。
  • 这种方法确保了我们能够在最少的操作次数内找到第n个丑数,非常高效且直接。

    上一篇:AcWing 63 字符串中第一个只出现一次的字符
    下一篇:2024年中国智能制造装备产业规模及发展前景预测分析(图)

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年04月10日 23时38分47秒