/**
*
* 求第n个丑数
* @author zhiyuan0226
*
* 2019/4/19
*
*/
public class UglyNumber {
// 思路:想象有三个队列,分别存储着丑数数组分别乘以2、3、5之后的数据
// 由于丑数数组是有序的
// 因此丑数只可能出现在这个队列的队首
// 但是队列可以想象 我们将 ugly[result2] 来
/** 下标 0 1 2 3 4 5 6 7 8
* ugly[] 1 2 3 4 5 6 8 9 10
* r2[] 1 2 4 6 8 10 12 16 18 20
* r3[] 1 3 6 9 12 15 18 24 27 30
* r5[] 1 5 10 15 20 25 30 40 45 50
*/
public static long findUglyNumber(int n) {
// 创建一个丑数数组 用于存放丑数
long[] ugly = new long[n];
// 第一个丑数为1
ugly[0] = 1;
// 分别表示X2、3、5 队列的下表
int result2 = 0, result3 = 0, result5 = 0;
int index = 1;
while (index < n) {
// 临界值分别乘以对应的值 最小值为新的丑数
ugly[index] = min(ugly[result2] * 2, ugly[result3] * 3, ugly[result5] * 5);
// 更新临界值
if (ugly[index] == ugly[result2] * 2) {
result2++;
}
if (ugly[index] == ugly[result3] * 3) {
result3++;
}
if (ugly[index] == ugly[result5] * 5) {
result5++;
}
index++;
}
// for (int i = 0; i < ugly.length; i++) {
// System.out.println(ugly[i]);
// }
return ugly[n-1];
}
// 求三个数的最小值
public static long min(long n1, long n2, long n3) {
long min = n1 < n2 ? n1 : n2;
return min < n3 ? min : n3;
}
public static void main(String[] args) {
System.out.println(findUglyNumber(100));
}
}
求第n个丑数
最新推荐文章于 2021-07-14 09:35:04 发布