编写一个程序,找出第 n
个丑数。
丑数就是只包含质因数 2, 3, 5
的正整数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12
是前 10 个丑数。
说明:
1
是丑数。n
不超过1690。
思路:这道题可以每个数都去验证然后逐个计算每个自然数,但是这样效率太低,注意到每个丑数都是2,3,5的连乘的结果,所以新的丑数一定是某个之前的丑数乘以2或3或5的结果,则我们通过3个变量来维持上次更新完2,3,5对应的结果(否则每次都从头来乘速度太慢),然后计算乘以2,3,5的最小的那个数,那么这个数就是新的丑数,以此来不断更新丑数。
参考代码:
int nthUglyNumber(int n) {
int *dp = new int[n];
if (n == 1) {
return 1;
}
dp[0] = 1;
int i_2 = 0; //记录乘以2的位置
int i_3 = 0; //记录乘以3的位置
int i_5 = 0; //记录乘以5的位置
int index = 1;
int res = 1;
while (index < n) {
while (dp[i_2] * 2 <= dp[index - 1]) {
i_2++;
}
while (dp[i_3] * 3 <= dp[index - 1]) {
i_3++;
}
while (dp[i_5] * 5 <= dp[index - 1]) {
i_5++;
}
int min_ = min(min(dp[i_2]*2, dp[i_3] * 3), dp[i_5] * 5);
dp[index] = min_;
index++;
}
res = dp[index-1];
delete[] dp;
return res;
}