264. 丑数 II

264. 丑数 II

给你一个整数 n ,请你找出并返回第 n 个 丑数 。

丑数 就是只包含质因数 2、3 和/或 5 的正整数。

示例 1:

输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。

优先队列(小顶堆)

  • 小顶堆:priority_queue<int,vector<int>,greater<int>> myqueue;,升序队列,堆顶的元素最小。
  • 大顶堆:priority_queue<int,vector<int>,less<int>> myqueue;,降序队列,堆顶的元素最大。默认为大顶堆。
  • 出栈:myqueue.pop() 弹出堆顶(队头)元素。
  • 因此,丑数队列可用小顶堆构造,因为它只可能是2,3,5为因数,所以入栈的元素,为栈顶元素 * 2,* 3,* 5。
  • 出栈出的是最小元素,因此只需要出栈(n-1)次,留下的头顶元素即是第n个丑数。
class Solution {
public:
    int nthUglyNumber(int n) {
        priority_queue<double,vector<double>, greater<double>> myqueue;
        double ans = 1;
        for(int i = 1; i < n; ++i){
            myqueue.push(ans*2);
            myqueue.push(ans*3);
            myqueue.push(ans*5);
            ans = myqueue.top();
            myqueue.pop();
            while(!myqueue.empty() && ans == myqueue.top())
                myqueue.pop();
        }
        return ans;
    }
};
posted @ 2021-04-12 14:34  andymori  阅读(58)  评论(0)    收藏  举报