0313super_ugly_number

博客围绕0313超级丑数题目展开,介绍了使用最小堆的解题方法。详细讲解了priority_queue队列,包括其元素排列、模板参数及常用操作,还提及了set的插入操作及返回值含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0313超级丑数

题目

https://leetcode-cn.com/problems/super-ugly-number/

方法一:最小堆

class Solution {
public:
    int nthSuperUglyNumber(int n, vector<int>& primes) {
        //使用优先队列来构建最小堆,依次取出最小堆的堆顶元素,取n次
        priority_queue<long,vector<long>,greater<long>> heap;
        //定义数组记录第n个数
        set<long> seen;
        heap.push(1);
        seen.insert(1);
        long cur=0;
        for(int i=0;i<n;i++)
        {
            cur=heap.top();
            heap.pop();
            for(long j:primes)
            {
                long flag=j*cur;
                //如果成功插入到set中,就把seen加入到堆里面
                if(seen.insert(flag).second)
                    heap.push(flag);
            }
        }
        return (int)cur;
    }
};

priority_queue

  • 定义了一个元素有序排列的队列。默认队列头部的元素优先级最高。因为它是一个队列,所以只能访问第一个元素,这也意味着优先级最高的元素总是第一个被处理

  • 模板有 3 个参数,其中两个有默认的参数;第一个参数是存储对象的类型,第二个参数是存储元素的底层容器,第三个参数是函数对象,它定义了一个用来决定元素顺序的断言

    template <typename T, typename Container=std::vector<T>, typename Compare=std::less<T>> class priority_queue
    
    //最大堆的定义
    priority_queue <int,vector<int>,less<int> > p;
    //最小堆定义
    priority_queue <int,vector<int>,greater<int> > q;
    
  • push(const T& obj):将obj的副本放到容器的适当位置,这通常会包含一个排序操作。

    pop():移除第一个元素。

    top():返回优先级队列中第一个元素的引用。

set

  • insert(key_value);

    将key_value插入到set中 ,返回值是pair<set::iterator,bool>,bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值