一、问题描述
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.
二、问题分析
1、The naive approach is to call isUgly
for every number until you reach the nth one. Most numbers are not ugly. Try to focus your effort on generating only the ugly ones.
2、An ugly number must be multiplied by either 2, 3, or 5 from a smaller ugly number.
3、The key is how to maintain the order of the ugly numbers. Try a similar approach of merging from three sorted lists: L1, L2, and L3.
4、Assume you have Uk, the kth ugly number. Then Uk+1 must be Min(L1 * 2, L2 * 3, L3 * 5).
5、PriorityQueue是一个基于优先级堆的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。
三、算法代码
public class Solution {
public int nthUglyNumber(int n) {
if(n==1) return n;
Queue<Long> uglyGenerated= new PriorityQueue<Long>();
int[] nums = {2,3,5};
Long result = Long.valueOf(1);
uglyGenerated.offer(result);
for(int i=0;i<n;i++){
// Each time we poll the peak value of uglyGenerated, is the ith number
result = uglyGenerated.poll();
for(int num:nums){
Long uglyNum = result*num;
if(!uglyGenerated.contains(uglyNum)){
uglyGenerated.offer(uglyNum);
}
}
}
return result.intValue();
}
}