class Solution {
// 动态规划,从最小丑数1开始,让每个丑数都分别乘2,3,5。但须将结果排序
// dp数组里存的是递增的丑数
// 注意需要去重,2*3与3*2出现一次就行。三个有序数组的合并(去重)
public int nthUglyNumber(int n) {
if(n==0){
return 0;
}
int[] dp=new int[n];
dp[0]=1;
// 三个指针
int p1=0,p2=0,p3=0;
for (int i = 1; i < dp.length; i++) {
// 取最小值,同时用另两个指针标记位置,还要用
int n1=dp[p1]*2,n2=dp[p2]*3,n3=dp[p3]*5;
dp[i]=Math.min(n1,Math.min(n2,n3));
// 不能用if else ,为了去重
if(n1==dp[i]){
p1++;
}
if(n2==dp[i]){
p2++;
}
if(n3==dp[i]){
p3++;
}
}
return dp[n-1];
}
}