Ugly-Number-series
Last updated
Last updated
class Solution {
public int nthUglyNumber(int n) {
if(n<0){
return 0;
}
int[] dp=new int[n];
dp[0]=1;
int p2=0;
int p3=0;
int p5=0;
for(int i=1;i<n;i++){
dp[i]=Math.min(dp[p2]*2,Math.min(dp[p3]*3,dp[p5]*5));
//这三个if需要并且的原因是如果当前的丑数序列是1、2、3、4、5,p2指向3,p3指向2,p5指向2
//如果三个if不是并列的,下一个丑数=min(dp[p2]*2=3*2=6,dp[p3]*3=6,dp[p5]*5=10)=6
//注意如果不是并列的,那么只会移动p2,这是p3仍然指向2
//下一轮,dp[p2]*2=4*2=8,dp[p3]*3=2*3,dp[p5]*5=2*5=10,这里又求出来一个6,重复了,而且竟然还会被认为是有效的添加至
//dp数组中
if(dp[i]==dp[p2]*2){
p2++;
}
//不是并且的就是指这里采用else if
if(dp[i]==dp[p3]*3){
p3++;
}
//不是并且的就是指这里采用else
if(dp[i]==dp[p5]*5){
p5++;
}
}
return dp[n-1];
}
}