leetcode 264. Ugly Number II
动态规划解决。
关键是理解如何生成新的丑数。这道题和经典的斐波那契数列问题其实是一样的。求第n个数,需要用第n个数前面的数来求。不同的是,斐波那契数列不会重复。而本题的丑数,会重复出现。
class Solution {
public:
int nthUglyNumber(int n) {
//dp[i]表示第i个丑数,dp[0]无意义
vector<int> dp(n+1);
dp[1] = 1;
int p2 = 1;
int p3 = 1;
int p5 = 1;
int num2,num3,num5;
for(int i = 2;i <=n;i++){
num2 = dp[p2]*2;
num3 = dp[p3]*3;
num5 = dp[p5]*5;
dp[i] = min(min(num2,num3),num5);
if(dp[i] == num2) p2++;
if(dp[i] == num3) p3++;
if(dp[i] == num5) p5++;
}
return dp[n];
}
};