原题
思路:
本题如果对每个数字进行判断,那么会超出时间限制,因此需要想其它办法,可以尝试动态规划的解决办法。
最小的丑数是1,其它丑数可以认为是1乘以因子(2,3,5)所得,本题因为要求第n大的丑数,暗含要按照顺序排列丑数。
需要做到每个位置都找到 当前丑数基准*当前指针因子 的最小值。
这里用三个指针(代表不同的乘积因子)指向自己的丑数基准
每次都比较一下 三个指针因子乘以指向丑数基准 的值
乘积最小的那个就是当前位置最小的丑数,同时对应的指针需要往后移动
代码
public int nthUglyNumber(int n) {
int[] factors = new int[]{2,3,5};
int[] dp = new int[n+1];
dp[1] = 1;
int p2 = 1;
int p3 = 1;
int p5 = 1;
for (int i = 2;i<=n;i++){
int num2 = dp[p2]*2;
int num3 = dp[p3]*3;
int num5 = dp[p5]*5;
int min = Math.min(Math.min(num2,num3),num5);
dp[i] = min;
if(min == num2)
p2++;
if(min == num3)
p3++;
if(min == num5)
p5++;
}
return dp[n];
}