剑指 Offer 49. 丑数
思路
丑数的定义:只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)
这里其实少说了一点,由2、3、5乘丑数的数也是丑数
如8 = 2 * 4 = 2 * 2 * 2,4是丑数,8也是丑数
那么我们只需要以dp数组乘2、3、5,得到的结果最小值就是当前位置丑数,
dp[0]=1,丑数下标a、b、c都为0
代码
public int nthUglyNumber(int n) {
int a=0,b=0,c=0;
int []dp=new int[n];
dp[0]=1;
for(int i=1;i<n;i++){
int aa=dp[a]*2,bb=dp[b]*3,cc=dp[c]*5;
dp[i]=Math.min(Math.min(aa,bb),cc);
if(aa==dp[i])a++;
if(bb==dp[i])b++;
if(cc==dp[i])c++;
// 不能这样写,因为可能aa==bb==cc==dp[i],全部++
// if(aa==dp[i])a++;
// else if(bb==dp[i])b++;
// else c++;//if(cc==dp[i])
}
return dp[n-1];
}