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.
题目含义:这道题是 26. Ugly Number的扩展,要求我们找到第n个丑数
思路:
-
申请一个长度为n的数组uglyNumbers,用于从小到大顺序存储n个丑数,数组中的首项为1,即第一个丑数为1
-
设置三个变量idx2、idx3、idx5存储下标,初始值都为1
-
找出数组uglyNumbers[idx2]*2、uglyNumbers[idx3]*3、uglyNumbers[idx5]*5的最小值,最小值即为下一个丑数,同时更新最小值对应的下标,如果多个数字同时为最小值,则它们的下标都要更新
-
找到第n个丑数时,循环结束
1 public int nthUglyNumber(int n) {
2 int[] uglynum = new int[n+1]; 3 uglynum[1] = 1; 4 5 int pointer2 = 1, pointer3 = 1, pointer5 = 1; 6 for(int i = 2; i <= n; i++){ 7 int min = Math.min(Math.min(uglynum[pointer2]*2, uglynum[pointer3]*3),uglynum[pointer5]*5); 8 if(min == uglynum[pointer2]*2) pointer2++; 9 if(min == uglynum[pointer3]*3) pointer3++; 10 if(min == uglynum[pointer5]*5) pointer5++; 11 uglynum[i] = min; 12 } 13 return uglynum[n]; 14 }