Write a program to find the n
-th ugly number.
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5
.
Example:
Input: n = 10
Output: 12
Explanation:
1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.
Note:
1
is typically treated as an ugly number.n
does not exceed 1690.
题目:找出第n个分子只包含2、3、5的丑数(通常1也被视作丑数)
思路:
方法1:从1开始,将1*2、1*3、1*5得到2、3、5,将积插入数组中,然后2*2、2*3、2*5得到4、6、10,以此类推....
然后将数组中相同的数合并、排序,最后找出第n位数就是第n位丑数。
缺点:复杂,需要合并和排序,而且不能精确判断计算出的丑数是否满足n位。
方法2:为了精确判断是否已生成第n位丑数,需要按顺序生成丑数。用三个index记录当前丑数是第几位丑数乘以多少生成的。
例如:2是由第一位丑数*2生成的:index2 =0, ,
3是由第一位丑数*3生成的:index3 =0, ,
4是由第二位丑数*2生成的:index2 =1, ,
5是由第一位丑数*5生成的:index5=0, ,
6是由第二位丑数*3生成的:index3=1,
或 由第三位丑数*2生成的:index2=2,
...
综上可总结规律:
每次得到 的值(X=2、3、5),取最小值作为下一个丑数
若 ,则;
代码:
class Solution {
public int nthUglyNumber(int n) {
int index2=0,index3=0,index5=0;
int[] uglyNums = new int[n];
uglyNums[0]=1;
for(int i=1;i<n;i++){
int uglyNum= Math.min(Math.min(uglyNums[index2]*2,uglyNums[index3]*3),uglyNums[index5]*5);
if(uglyNum == uglyNums[index2]*2) index2++;
if(uglyNum == uglyNums[index3]*3) index3++;
if(uglyNum == uglyNums[index5]*5) index5++;
uglyNums[i]=uglyNum;
}
return uglyNums[n-1];
}
}