1234567891011121314151617181920212223242526272829class Solution { public int nthUglyNumber(int n) { //三指针解法 int[] dp = new int[n + 1]; dp[1] = 1; //将第一个丑数给数组的第二个值,以便于观察与理解 int p2 = 1, p3 = 1, p5 = 1; for (int i = 2; i <= n; i++) { //从第三个开始 int num2 = dp[p2] * 2, num3 = dp[p3] * 3, num5 = dp[p5] * 5; //乘法用第一个丑数求第2个丑数 dp[i] = Math.min(Math.min(num2, num3), num5); //第二个抽数是最小丑数,赋值给数组数第三个数 //1,1*2,1*3,2*2,1*5,2*3,2*2*2,2*5…… if (dp[i] == num2) { //将最小丑数找出,p下标加一进入下一个丑数,以达成不断的轮换的目的 p2++; } if (dp[i] == num3) { //使每个丑数都能被精确找到,因为每个丑数都可以 p3++; } if (dp[i] == num5) { p5++; } } return dp[n]; }}