题目一: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;
}
};