动态规划解法:
定义数组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];
} 


京公网安备 11010502036488号