264.丑数II

264.丑数II

思路:优先队列(小顶堆)

1.将最小丑数 1 放入队列
2.每次从队列取出最小值 x,然后将 x 所对应的丑数 2x、3x 和 5x 进行入队。
3.对步骤 2 循环多次,第 n 次出队的值即是答案。
为了防止同一丑数多次进队,我们需要使用哈希表(数据结构 set )来记录入过队列的丑数。

class Solution {
public:
    int nthUglyNumber(int n) {
        //小顶堆
        priority_queue<long,vector<long>,greater<long>>   q;
        unordered_set<long> s;
        int nums[]={2,3,5};
        //最小丑数1放入哈希表和优先队列
        s.insert(1);
        q.push(1);
        for(int i=1;i<=n;i++){
            long x=q.top();
            q.pop();
            //第n次pop是第n大的丑数
            if (i == n)
                return (int)x;
            for(int j=0;j<3;j++){
                long tmp=nums[j]*x;
                if(!s.count(tmp)){
                    q.push(tmp);
                    s.insert(tmp);
                }
            }
        }        
        return -1;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值