堆和set集合的相关操作入门题。

题目一:2336. 无限集中的最小数字

无限集中的最小数组
此题只要了解c++中set的相关操作就非常简单了。

//常用函数(必学)
insert()//插入元素
count()//判断容器中是否存在某个元素
size()//返回容器的尺寸,也可以元素的个数
erase()//删除集合中某个元素
clear()//清空集合
empty()//判断是否为空
begin()//返回第一个节点的迭代器
end()//返回最后一个节点加1的迭代器
rbegin()//反向迭代器
rend()//反向迭代器

//功能函数(进阶)
find()//查找某个指定元素的迭代器
lower_bound()//二分查找第一个不小于某个值的元素的迭代器
get_allocator()//返回集合的分配器
swap()//交换两个集合的变量
max_size()//返回集合能容纳元素的最大限值

代码

class SmallestInfiniteSet {
    set<int>S;
public:
    SmallestInfiniteSet() {
        for(int i=1;i<1200;++i)
        S.insert(i);
    }
    
    int popSmallest() {
        auto iter=S.begin();
        int v=*iter;
        S.erase(iter);
        return v;
    }
    
    void addBack(int num) {
        if(S.find(num)==S.end())
        S.insert(num);
    }
};

题目二:2233. K 次增加后的最大乘积

K 次增加后的最大乘积
思路
分析题意可知
每一次累加最小值便可使得nums的乘积最大。
因此我们采用堆,将其从小到大存储,
接下来删除最小元素,先pop_heap() 后nums.back()
将最小元素++,再添加进堆(push_back())
*push_back只会添加最后一个元素。
push_heap(_First, _Last,_Comp)
要先在底层容器(数组或vector)里加入数据,再调用push_heap()。
实现细节:(1)添加元素到vector的尾部;(2)重新调整堆。
该算法必须是在满足堆序的条件下,添加元素。
堆不是容器,而是组织容器元素的一种特别方式。
代码

class Solution {
public:
    int maximumProduct(vector<int>& nums, int k) {
        make_heap(nums.begin(),nums.end(),greater<int>());
        while(k--)
        {
            pop_heap(nums.begin(),nums.end(),greater<int>());
            ++nums.back();
            push_heap(nums.begin(),nums.end(),greater<int>());
        }
        int res=1;
        for(int num:nums)
            res=(long long)num*res%1000000007;
        return res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值