Write a program to find the n
-th ugly number.
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5
. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12
is the sequence of the first 10
ugly numbers.
Note that 1
is typically treated as an ugly number, and n does not exceed 1690.
public int nthUglyNumber(int n) {
int[] uglyNumbers = new int[n];
uglyNumbers[0] = 1;
int idx2 = 0;
int idx3 = 0;
int idx5 = 0;
int counter = 1;
while (counter < n) {
int min = Math.min(Math.min(uglyNumbers[idx2] * 2, uglyNumbers[idx3] * 3), uglyNumbers[idx5] * 5);
if (min == uglyNumbers[idx2] * 2) {
idx2++;
}
if (min == uglyNumbers[idx3] * 3) {
idx3++;
}
if (min == uglyNumbers[idx5] * 5) {
idx5++;
}
uglyNumbers[counter] = min;
counter++;
}
return uglyNumbers[n - 1];
}
-
申请一个长度为n的数组uglyNumbers,用于从小到大顺序存储n个丑数,数组中的首项为1,即第一个丑数为1
-
设置三个变量idx2、idx3、idx5存储下标,初始值都为0
-
找出数组uglyNumbers[idx2]*2、uglyNumbers[idx3]*3、uglyNumbers[idx5]*5的最小值,最小值即为下一个丑数,同时更新最小值对应的下标,如果多个数字同时为最小值,则它们的下标都要更新
- 找到第n个丑数时,循环结束