题目:题目
1 = 2^0 * 3^0 * 5^0
2 = 2^1 * 3^0 * 5^0
3 = 2^0 * 3^1 *5^0
.
.
.
依次类推,这便是丑数
假设 uglyNumber = 2^i * 3^j * 5^k;
i,j,k这三个数哪一个变化,表明上一个数乘上了那个数字
我们声明一个新的数组arr来存储丑数,第一位丑数为1,即 arr[0] = 1
即
1 -----> i = 0, j = 0, k = 0
2 -----> i = 1, j = 0, k = 0 即在1基础上乘上2
3 ------> i = 0, j = 1, k = 0
4 ------> i = 2, j = 0, k = 0
.
.
.
在这里我们使用的是Math类的静态方法min来求下一个丑数中的最小丑数作为下一个丑数
代码如下:
int[] arr = new int[n];
arr[0] = 1;
int p2 = 0; // i
int p3 = 0; // j
int p5 = 0; // k
for (int i = 1; i < n; i++) {
arr[i] = Math.min(arr[p2] * 2, Math.min(arr[p3] * 3, arr[p5] * 5) );
if (arr[i] == arr[p2] * 2) {
p2++; // 若这个丑数是上个丑数乘上了一个2 则i加1
}
if (arr[i] == arr[p3] * 3) {
p3++;
}
if (arr[i] == arr[p5] * 5) {
p5++;
}
}
return arr[n - 1];
这几天有点累,有点懈怠了,这种情绪必须得克服,这次的题目解法是来自九章算法网上的,我自己用的暴力解法hhh,有点垮 T_T,我希望通过这种方式能填补自己的不足,虽然算法接触的少,但是一切在于积累,相信自己!