Skip to the content.

Ex49 丑数

题目描述

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

解题思路

把一个数作为起始值,下一个数就是:min(vec[index2]*2, vec[index3]*3, vec[index5]*5)。如果哪个乘数下的index是min值,就更新相应的index。

是有一点动态规划的思想在里面的。

代码

class Solution {
 public:
  int nthUglyNumber(int n) {
    int start = 1;
    std::vector<int> vec;
    vec.reserve(n);
    vec.push_back(start);
    int index2 = 0, index3 = 0, index5 = 0;
    for (int i = 1; i < n; ++i) {
      int res =
          std::min(std::min(vec[index2] * 2, vec[index3] * 3), vec[index5] * 5);
      vec.push_back(res);
      if (res == vec[index2] * 2) ++index2;
      if (res == vec[index3] * 3) ++index3;
      if (res == vec[index5] * 5) ++index5;
    }
    return *(vec.end() - 1);
  }
};

结果

执行结果:通过

执行用时:16 ms, 在所有 C++ 提交中击败了45.28%的用户

内存消耗:7.9 MB, 在所有 C++ 提交中击败了33.06%的用户