丑数 II
题目
设计一个算法,找出只含素因子2,3,5 的第 n 大的数。
符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12…注意事项
我们可以认为1也是一个丑数样例
如果n = 9, 返回 10
挑战
要求时间复杂度为O(nlogn)或者O(n)
题解
我们可以先回顾一下丑数的解法,用该数循环除以2,3,5,直至不能再除为止。那么本题我们是不是可以逆向思维一下,用2,3,5三个数去组合拼装出所有的丑数呢。本题可以使用优先队列来解决。为2,3,5三个因子各建立1个队列,并将2,3,5分别入列,再优先将最小值出列为第1各丑数(需考虑1)。下次循环将上次出列的最小值一次乘以各队列的头元素获取下一轮丑数,并在此优先出列最小值…
class Solution {
/**
* @param n an integer
* @return the nth prime number as description.
*/
public int nthUglyNumber(int n) {
Queue<Integer> q2 = new LinkedList<>();
Queue<Integer> q3 = new LinkedList<>();
Queue<Integer> q5 = new LinkedList<>();
int count = 1;
int val = 1;
while(count < n)
{
q2.offer(2*val);
q3.offer(3*val);
q5.offer(5*val);
int min = Math.min(Math.min(q2.peek(),q3.peek()),q5.peek());
if (q2.peek() == min)
{
q2.poll();
}
if (q3.peek() == min)
{
q3.poll();
}
if (q5.peek() == min)
{
q5.poll();
}
count++;
val = min;
}
return val;
}
};
Last Update 2016.9.29