【算法练习】模拟买卖匹配

刷题

今天的刷题真实的气死了,因为选择数据结构的问题,一开始选择了multiset,不知道为什么里面插入的元素怎么不能更改;后来参考别人的题解选择了map;其实我应该选择的是大顶堆和小顶堆,但是今天已经不想做这道题了,令人痛苦。

 

5710. 积压订单中的订单总数

代码

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;

}
};

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值