LeetCode 1801.积压订单中的订单总数

LeetCode 1801.积压订单中的订单总数

今天每日一题有点东西,一开始直接用vector加插入排序维护两个初始有序的序列但是超时了,应该是维护有序数列的过程中的插入删除操作把时间复杂度顶到n方,1e5的数据范围爆时间就是合理的了,然后考虑用优先队列。优先队列用的是大根堆小根堆,时间复杂度在nlogn左右,然后才过了,还是有一点难度的。

class Solution {
public:
    int getNumberOfBacklogOrders(vector<vector<int>>& orders) {
        priority_queue<pair<int,int>> buy;//buy存采购,降序
        priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>> sell;//sell存销售,升序
        int n=orders.size(),ans=0,mod=1e9+7;
        for (int i=0;i<n;i++){
            if (orders[i][2]==0){
                while(orders[i][1] && !sell.empty() && sell.top().first<=orders[i][0]){//卖出队列最低者
                    auto [price,amoumt]=sell.top();
                    sell.pop();
                    if (amoumt<=orders[i][1]){
                        ans=(ans-amoumt+mod)%mod;
                        orders[i][1]-=amoumt;
                    }else{
                        sell.push({price,amoumt-orders[i][1]});
                        ans=(ans-orders[i][1]+mod)%mod;
                        orders[i][1]=0;
                    }
                }
                if (orders[i][1]){
                        buy.push({orders[i][0],orders[i][1]});//记得加大括号,是同一元素
                        ans=(ans+orders[i][1])%mod;
                    }
            }else{
                while(orders[i][1] && !buy.empty() && buy.top().first>=orders[i][0]){//买入队列最高者
                    auto [price,amoumt]=buy.top();
                    buy.pop();
                    if (amoumt<=orders[i][1]){
                        ans=(ans-amoumt+mod)%mod;
                        orders[i][1]-=amoumt;
                    }else{
                        buy.push({price,amoumt-orders[i][1]});
                        ans=(ans-orders[i][1]+mod)%mod;
                        orders[i][1]=0;
                    }
                }
                if (orders[i][1]){
                        sell.push({orders[i][0],orders[i][1]});
                        ans=(ans+orders[i][1])%mod;
                    }
            }
        }
        return ans;
    }
};
/*
        for (int i=0;i<n;i++){
            if (orders[i][2]==0){
                for (int j=0;j<sell.size();j++)
                    if (sell[j][0]<=orders[i][0]){
                        if (sell[j][1]<=orders[i][1]){
                            orders[i][1]=orders[i][1]-sell[j][1];
                            sell.erase(sell.begin()+j);
                            j--;
                        }else{
                            sell[j][1]=sell[j][1]-orders[i][1];
                            orders[i][1]=0;
                            break;
                        }
                    }
            }else{
                for (int j=0;j<buy.size();j++)
                    if (buy[j][0]>=orders[i][0]){
                        if (buy[j][1]<=orders[i][1]){
                            orders[i][1]=orders[i][1]-buy[j][1];
                            buy.erase(buy.begin()+j);
                            j--;
                        }else{
                            buy[j][1]=buy[j][1]-orders[i][1];
                            orders[i][1]=0;
                            break;
                        }
                    }
            }
            if (orders[i][1]!=0){
                if (orders[i][2]==0){
                    bool increasebuy=0;
                    for (int j=0;j<buy.size();j++)
                        if (buy[j][0]<=orders[i][0]){
                            buy.insert(buy.begin()+j,orders[i]);
                            increasebuy=1;
                            break;
                        }
                    if (!increasebuy) buy.insert(buy.end(),orders[i]);
                }else{
                    bool increasesell=0;
                    for (int j=0;j<sell.size();j++)
                        if (sell[j][0]>=orders[i][0]){
                            sell.insert(sell.begin()+j,orders[i]);
                            increasesell=1;
                            break;
                        }
                    if (!increasesell) sell.insert(sell.end(),orders[i]);
                }
            }
        }
        int ans=0;
        for (int j=0;j<sell.size();j++)
            ans=(ans+sell[j][1]) % 1000000007;
        for (int j=0;j<buy.size();j++)
            ans=(ans+buy[j][1]) % 1000000007;
        return ans;
        */