给你一个整数 n
,请你找出并返回第 n
个 丑数 。
丑数 就是质因子只包含 2
、3
和 5
的正整数。
示例 1:
输入:n = 10 输出:12 解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
示例 2:
输入:n = 1 输出:1 解释:1 通常被视为丑数。
提示:
1 <= n <= 1690
动态规划
class Solution {
public:
int nthUglyNumber(int n) {
vector<int> dp(n); // 存储前 n 个丑数
dp[0] = 1; // 第一个丑数是 1
int i2 = 0, i3 = 0, i5 = 0; // 初始化指针
for (int i = 1; i < n; i++) {
int next2 = dp[i2] * 2;
int next3 = dp[i3] * 3;
int next5 = dp[i5] * 5;
int nextUgly = min(next2, min(next3, next5)); // 找出最小丑数
dp[i] = nextUgly; // 更新丑数
if (nextUgly == next2) i2++;// 移动指针
if (nextUgly == next3) i3++;
if (nextUgly == next5) i5++;
}
return dp[n - 1]; // 返回第 n 个丑数
}
};
用一个数组 dp
来保存前 n
个丑数。动态规划的思想是每次从已知的丑数中生成下一个最小的丑数,并把它加入数组 dp
中。
我们用三个指针 i2
, i3
, i5
分别追踪已经乘过 2
、3
和 5
的丑数的位置。这些指针作为从零开始的增加的因子,生成的数一定是丑数。那么只需要不断找到他们生成的丑数的最小值并放入数组dp即可。