动态规划解决。
关键是理解如何生成新的丑数。这道题和经典的斐波那契数列问题其实是一样的。求第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];}
};