题目
我们把只包含质因子2、3和5的数称作丑数(Ugly Number)。
例如6、8都是丑数,但14不是,因为它包含质因子7。
求第n个丑数的值。
样例
输入:5
输出:5
注意:习惯上我们把1当做第一个丑数。

解法:三路归并

将2,3,5生成的丑数合并到一个数组当中,记录2,3,5生成的最后一个数对应的位置,每次从三个生成的数当中取最小的加入到数组中,同时更新相应的位置。
这样直接由丑数生成新丑数,而不是逐个数字判断,效率得到提高
时间复杂度O(n),空间复杂度O(n)

  1. class Solution {
  2. public:
  3. int getUglyNumber(int n) {
  4. vector<int> v;
  5. v.push_back(1);
  6. int i = 0, j = 0, k = 0;
  7. while (--n) {
  8. int num = min(v[i] * 2, min(v[j] * 3, v[k] * 5));
  9. v.push_back(num);
  10. if (num == v[i] * 2) i++;
  11. if (num == v[j] * 3) j++;
  12. if (num == v[k] * 5) k++;
  13. }
  14. return v.back();
  15. }
  16. };