刨根究底才能记忆深刻。
算法题:
如果一个数只有质数因子2
,3
,5
,那么这个数是一个丑数。
前10个丑数分别为 1, 2, 3, 4, 5, 6, 8, 9, 10, 12...
设计一个算法,找出第N个丑数。
我们可以认为 1
也是一个丑数。
给出的标准答案之一为:
public int nthUglyNumber(int n) {
int[] res = new int[n];
res[0] = 1;
int p2 = 0;
int p3 = 0;
int p5 = 0;
for (int i = 1; i < n; i++) {
res[i] = Math.min(res[p2] * 2, Math.min(res[p3] * 3, res[p5] * 5) );
if (res[i] == res[p2] * 2) {
p2++;
}
if (res[i] == res[p3] * 3) {
p3++;
}
if (res[i] == res[p5] * 5) {
p5++;
}
}
return res[n - 1];
}
首先理解丑数除了1之外,底子都是2、3、5,然后取他们的倍数。
所以假定要创建一个大小为N的丑数数组,那数组最后一个数就是第N个丑数。
直接根据代码举例子:
i = 1 时,
res[1] = 2、3、5 ----> 取最小值2
p2 = 1
i = 2 时,
res[2] = 4、3、5 ----> 取最小值3
p3 = 1
i = 3 时,
res[3] = 4、6、5 ----> 取最小值5
p5 = 1
i = 4 时,
res[4] = 4、6、10 ----> 取最小值4
p2 = 2
………………
下面三个 if 其实就是当丑数数组逐渐增大时,判断下面增加2、3、5的倍数是几倍。
res[i] = Math.min(res[p2] * 2, Math.min(res[p3] * 3, res[p5] * 5) );
这个是为了按顺序增加2、3、5、的倍数。
这题重点就在于刚开始的找规律。