如图
这不就是前面说的反向需求,对于判断某个数是否是丑数,直接找到不大于那个数的全部丑数就好了,看上去用动态规划和回溯算法都可以,先上动态规划解
public static int nthUglyNumber(int n) { //dp[n]=min(dp[l1]*2,dp[l2]*3,dp[l3]*5)
int []dp=new int[n];
dp[0]=1;
int l1=0,l2=0,l3=0; //分别是前序*2,*3,*5基数的index
for(int i=1;i<n;i++) {
int min =min(2*dp[l1],3*dp[l2],5*dp[l3]); //对应取值判断
dp[i]=min;
if(min==(dp[l1]*2)) { //注意判断应当独立判断
l1+=1;
}
if(min==(dp[l2]*3)) {
l2+=1;
}
if(min==(dp[l3]*5))
{
l3+=1;
}
}
return dp[n-1];
}
private static int min(int i, int j, int k) {
return Math.min(i, Math.min(j, k));
}
应该是十分直观了,
回溯算法,后续不上,不过效率应该是赶不上动态规划的