刷题
今天的刷题真实的气死了,因为选择数据结构的问题,一开始选择了multiset,不知道为什么里面插入的元素怎么不能更改;后来参考别人的题解选择了map;其实我应该选择的是大顶堆和小顶堆,但是今天已经不想做这道题了,令人痛苦。
代码
class Solution {
public:
map<int,long long> sell; //price amount
map<int,long long> buy;
int getNumberOfBacklogOrders(vector<vector<int>>& orders) {
int n=orders.size();
if(n==0){
return 0;
}
//因为迭代器和其他的问题 导
for(int i=0;i<n;i++){
//买
if(orders[i][2]==0){
int buy_p=orders[i][0];
//在能卖的里面从最小的找起
for(auto it=sell.begin();it!=sell.end();){
if(it->first<=buy_p){
if(it->second >orders[i][1]){ //能卖的数量>买的数量
//全部买完
it->second-=orders[i][1]; //更新sell的数量
orders[i][1]=0;
break;
}else{
//能卖的数量<买的数量
//sell这一条目卖完
orders[i][1]-=it->second;//更新买条目的数量
sell.erase(it++);
}
}else{
break;
}
}
if(orders[i][1]!=0){
buy[orders[i][0]]+=orders[i][1]; //这个位置是易错点 如果有两个价格一样的条目那么就更新错了
}
}else{
//卖
int sell_p=orders[i][0];
for(auto rit=buy.rbegin(); rit!=buy.rend(); ){ //这个里面不能rit++
if(rit->first>=sell_p){
//从最高出价开始匹配
if(orders[i][1]<rit->second){
//卖完了
rit->second-=orders[i][1]; //修改买的这个条目的数量
orders[i][1]=0; //卖的这个条目匹配完成 数目为0
break;
}else{
orders[i][1]-=rit->second; //修改卖的这个条目的数量
//删除买的对应条目
buy.erase((++rit).base());
}
}else{
break;
}
}
if(orders[i][1]!=0){
sell[orders[i][0]]+=orders[i][1];
}
}
}
long long ans=0;
int mod=1e9+7;
for(auto it=buy.begin();it!=buy.end();it++){
ans+=it->second;
ans%=mod;
}
for(auto it=sell.begin();it!=sell.end();it++){
ans+=it->second;
ans%=mod;
}
return (int)ans;
}
};