动态规划解法:
定义数组dp,dp[i]存储第i个丑数,由定义可知,dp[1]=1;
定义三个指针数p2,p3,p5,初始值均初始化为1;
当 2 ≤ i ≤ n时,取dp[i]=min { dp[p2]×p2,dp[p3]×p3,dp[p5]×p5 };
对于丑数而言,任何丑数都是由2,3,5乘积而成的,即可以通过2,3,5不断构造新的丑数。
i不断递增, 然后找出最小的那个作为新的丑数
/** * 动态规划解法 * * @param index * @return */ public int GetUglyNumber_Solution(int index) { if (index <= 0) { return 0; } int dp[] = new int[index + 1]; dp[1] = 1; int p2 = 1, p3 = 1, p5 = 1; for (int i = 2; i <= index; i++) { int num2 = dp[p2] * 2, num3 = dp[p3] * 3, num5 = dp[p5] * 5; dp[i] = Math.min(Math.min(num2, num3), num5); if(dp[i] == num2){ p2++; } if(dp[i] == num3){ p3++; } if(dp[i] == num5){ p5++; } } return dp[index]; }