Write a program to find the n-th ugly number.
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5.
Example:
Input: n = 10
Output: 12
Explanation: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.
解题思路
这道题采用动态规划的解法。
我们可以理解为:每一个丑数都是它前面的某个丑数乘2、乘3或乘5得到的。因此只要前面的丑数按顺序排好就行。每一个丑数都有三种方式得到下一个丑数,那么我们只需要记录某一个丑数第一次得到的方式即可(换句话说它是由它前面的哪个丑数以哪种方式得到的)。在得到新的丑数的同时,要更新能够得到当前丑数的其他丑数的位置,避免重复计算。如此重复,可以得到第n个丑数的大小。
C++代码
class Solution {
public:
int nthUglyNumber(int n) {
if(n == 1){
return 1;
}
int index2 = 0, index3 = 0, index5 = 0;
int rec[1691] = {1};
int count = 1;
while(count < n) {
int p = min(2*rec[index2], min(3*rec[index3], 5*rec[index5]));
rec[count] = p;
if(p == 2*rec[index2]) index2++;
if(p == 3*rec[index3]) index3++;
if(p == 5*rec[index5]) index5++;
count++;
}
return rec[n-1];
}
};