https://leetcode-cn.com/problems/chou-shu-lcof/
算法思想
动态规划
思路
一个丑数肯定是由前面的某个丑数乘以2或者乘以3或者乘以5得到的。所以就要定义三个指针p2,p3,p5.这三个指针指向的数字永远指向对应的2,3,5 。
初始条件是dp[0] = 1. p2=p3=p5=0;
转移方程: dp[i] = min( min(dp[p2],dp[p3]),dp[p5])
结果是:dp[n-1]
需要注意的是:dp[p2]*2, dp[p3]*3 dp[p2]*5 三个可能出现重复,出现这种情况的时候要注意p2,p3,p5的指针移动
代码
class Solution {
public int nthUglyNumber(int n) {
int[] dp= new int[n];
int p2=0,p3=0,p5=0;
dp[0] =1;
for(int i=1;i<n;i++){
dp[i] = Math.min(Math.min(dp[p2]*2,dp[p3]*3),dp[p5]*5);
if(dp[i] == dp[p2]*2 ){
p2++;
}
if(dp[i] == dp[p3]*3)
{
p3++;
}
if(dp[i] == dp[p5]*5){
p5++;
}
}
return dp[n-1];
}
}