leetcode1801:积压订单中的订单总数(1.2日每日一题)

news2024/11/16 18:06:07

                                               迟来的元旦快乐!!!

题目表述:

给你一个二维整数数组 orders ,其中每个 orders[i] = [pricei, amounti, orderTypei] 表示有 amounti 笔类型为 orderTypei 、价格为 pricei 的订单。

订单类型 orderTypei 可以分为两种:

0 表示这是一批采购订单 buy
1 表示这是一批销售订单 sell
注意,orders[i] 表示一批共计 amounti 笔的独立订单,这些订单的价格和类型相同。对于所有有效的 i ,由 orders[i] 表示的所有订单提交时间均早于 orders[i+1] 表示的所有订单。

存在由未执行订单组成的 积压订单 。积压订单最初是空的。提交订单时,会发生以下情况:

如果该订单是一笔采购订单 buy ,则可以查看积压订单中价格 最低 的销售订单 sell 。如果该销售订单 sell 的价格 低于或等于 当前采购订单 buy 的价格,则匹配并执行这两笔订单,并将销售订单 sell 从积压订单中删除。否则,采购订单 buy 将会添加到积压订单中。
反之亦然,如果该订单是一笔销售订单 sell ,则可以查看积压订单中价格 最高 的采购订单 buy 。如果该采购订单 buy 的价格 高于或等于 当前销售订单 sell 的价格,则匹配并执行这两笔订单,并将采购订单 buy 从积压订单中删除。否则,销售订单 sell 将会添加到积压订单中。
输入所有订单后,返回积压订单中的 订单总数 。由于数字可能很大,所以需要返回对 109 + 7 取余的结果。

 

示例 1:


输入:orders = [[10,5,0],[15,2,1],[25,1,1],[30,4,0]]
输出:6
解释:输入订单后会发生下述情况:
- 提交 5 笔采购订单,价格为 10 。没有销售订单,所以这 5 笔订单添加到积压订单中。
- 提交 2 笔销售订单,价格为 15 。没有采购订单的价格大于或等于 15 ,所以这 2 笔订单添加到积压订单中。
- 提交 1 笔销售订单,价格为 25 。没有采购订单的价格大于或等于 25 ,所以这 1 笔订单添加到积压订单中。
- 提交 4 笔采购订单,价格为 30 。前 2 笔采购订单与价格最低(价格为 15)的 2 笔销售订单匹配,从积压订单中删除这 2 笔销售订单。第 3 笔采购订单与价格最低的 1 笔销售订单匹配,销售订单价格为 25 ,从积压订单中删除这 1 笔销售订单。积压订单中不存在更多销售订单,所以第 4 笔采购订单需要添加到积压订单中。
最终,积压订单中有 5 笔价格为 10 的采购订单,和 1 笔价格为 30 的采购订单。所以积压订单中的订单总数为 6 。
示例 2:


输入:orders = [[7,1000000000,1],[15,3,0],[5,999999995,0],[5,1,1]]
输出:999999984
解释:输入订单后会发生下述情况:
- 提交 109 笔销售订单,价格为 7 。没有采购订单,所以这 109 笔订单添加到积压订单中。
- 提交 3 笔采购订单,价格为 15 。这些采购订单与价格最低(价格为 7 )的 3 笔销售订单匹配,从积压订单中删除这 3 笔销售订单。
- 提交 999999995 笔采购订单,价格为 5 。销售订单的最低价为 7 ,所以这 999999995 笔订单添加到积压订单中。
- 提交 1 笔销售订单,价格为 5 。这笔销售订单与价格最高(价格为 5 )的 1 笔采购订单匹配,从积压订单中删除这 1 笔采购订单。
最终,积压订单中有 (1000000000-3) 笔价格为 7 的销售订单,和 (999999995-1) 笔价格为 5 的采购订单。所以积压订单中的订单总数为 1999999991 ,等于 999999984 % (109 + 7) 。
 

 

提示:

1 <= orders.length <= 10^5
orders[i].length == 3
1 <= price, amount<= 10^9
orderTypei 为 0 或 1

解题思路:

         观察orders和price数据范围,可以定义订单总数为long long类型,也可以是每次加订单总数的时候对mod取余。

优先队列:        

    priority_queue<int,vector<int>,greater<int> >que;//最小值优先
    priority_queue<int,vector<int>,less<int> >que;//最大值优先

其实题目描述的就是“价格优先”的竞价规则。
所谓“价格优先”,就是优先成交“出价最高”的“买方”和“出价最低”的“卖方”。

也就是为什么将buy用最大值优先队列定义,sell用最小值优先队列定义。

对orders进行遍历:

如果元素数组下标为2的数据为0,则是采购(buy)订单:

对sell订单进行遍历,while()结束后,如果采购的订单数量大于sell的数量,将剩余的buy价格price和数量amount存储到优先队列buy中。(while循环中的三个条件是遍历数组的数量必须大于0,销售队列不为空且销售的价格小于遍历数组的价格price)

如果元素数组下标为2的数据为1,则是销售(sell)订单:

对buy订单进行遍历,while()结束后,如果销售的订单数量大于buy的数量,将剩余的sell价格price和数量amount存储到优先队列sell中。(while循环中的三个条件是遍历数组的数量必须大于0,采购队列不为空且采购的价格大于等于遍历数组的价格price)

解题代码:

class Solution {
public:
    int getNumberOfBacklogOrders(vector<vector<int>>& orders) {
        priority_queue<pair<int,int>>buy;
        priority_queue<pair<int,int>,vector<pair<int,int>>,greater<>>sell;
        int res=0;
        int mod=1e9+7;
        for(int i=0;i<orders.size();i++)
        {
            if(orders[i][2]==0)
            {
                while(orders[i][1]>0&&!sell.empty()&&sell.top().first<=orders[i][0])
                {
                    int prices=sell.top().first;
                    int amount=sell.top().second;
                    sell.pop();
                    if(amount>orders[i][1])
                    {
                        sell.push({prices,amount-orders[i][1]});
                        res=(res-orders[i][1]+mod)%mod;
                        orders[i][1]=0;
                    }
                    else
                    {
                        res=(res+mod-amount)%mod;
                        orders[i][1]=orders[i][1]-amount;
                    }
                }
                if(orders[i][1]>0)
                {
                    buy.push({orders[i][0],orders[i][1]});
                    res=(res+orders[i][1])%mod;
                }
            }
            else
            {
                while(orders[i][1]>0&&!buy.empty()&&buy.top().first>=orders[i][0])
                {
                    int prices =buy.top().first;
                    int amount =buy.top().second;
                    buy.pop();
                    if(amount<=orders[i][1])
                    {
                        res=(res-amount+mod)%mod;
                        orders[i][1]=orders[i][1]-amount;
                    }
                    else
                    {
                        buy.push({prices,amount-orders[i][1]});
                        res=(res-orders[i][1]+mod)%mod;
                        orders[i][1]=0;
                    }
                }
                if(orders[i][1]>0)
                {
                    sell.push({orders[i][0],orders[i][1]});
                    res=(res+orders[i][1])%mod;
                }
            }
        }
        return res;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136711.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电子档案利用安全控制的办法与实现

这篇文章是笔者2015年发表在《保密科学技术》第2期的一篇文章&#xff0c;时隔7年半温习了一遍之后感觉还有一定的可取之处&#xff0c;所以在结合当前档案法律法规相关要求并修改完善其中部分内容之后分享给大家。 引言 INTRODUCTION 21世纪是一个信息化高度发展的时代&#…

网站漏洞与漏洞靶场(DVWA)

数据来源 本文仅用于信息安全学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 为什么要攻击网站&#xff1f;常见的网站漏洞有哪些&#xff1f; 在互联网中&#xff0c;…

Java安装详细步骤(win10)

一、下载JDK JDK下载地址&#xff1a;Java Archive | Oracle&#xff0c;下图为win10版本 二、安装过程 2.1 以管理员方式运行exe 2.2 更改JDK安装目录和目标文件夹的位置 2.3 安装完成 三、配置环境变量 3.1 快速打开环境变量设置 WinR打开运行对话框&#xff0c;输入…

【计组】CPU并行方案--《深入浅出计算机组成原理》(四)

课程链接&#xff1a;深入浅出计算机组成原理_组成原理_计算机基础-极客时间 一、Superscalar和VLIW 程序的 CPU 执行时间 指令数 CPI Clock Cycle Time CPI 的倒数&#xff0c;又叫作 IPC&#xff08;Instruction Per Clock&#xff09;&#xff0c;也就是一个时钟周期…

软件测试新手入门必看

随着软件开发行业的日益成熟&#xff0c;软件测试岗位的需求也越来越大。众所周知&#xff0c;IT技术行业一直以来都是高薪岗位的代名词&#xff0c;零基础想要转业的朋友想要进入这个行业&#xff0c;入门软件测试是最佳的途径之一。考虑到大多数软件测试小白对这个行业的一片…

动态规划——树形dp

树形dp 文章目录树形dp概述树形dp 路径问题树的最长路径思路代码树的中心换根DP思路代码数字转换思路代码树形dp 有依赖的背包二叉苹果树思路代码树形dp 状态机没有上司的舞会思路代码战略游戏思路代码皇宫看守思路代码总结概述 树形 DP&#xff0c;即在树上进行的 DP。由于…

springboot常用启动初始化方法

在日常开发时&#xff0c;我们常常需要 在SpringBoot 应用启动时执行某一些逻辑&#xff0c;如下面的场景&#xff1a; 1、获取一些当前环境的配置或变量&#xff1b; 2、连接某些外部系统&#xff0c;读取相关配置和交互&#xff1b; 3、启动初始化多线程&#xff08;线程池…

Linux 网络编程套接字

目录 一.网络知识 1.网络通信 2.端口号 &#xff08;1&#xff09;介绍 &#xff08;2&#xff09;端口号和进程ID 3.TCP协议 4.UDP协议 5.网络字节序 二. socket编程接口 1.socket常见API 2.sockaddr结构 &#xff08;1&#xff09;sockaddr结构 &#xff08;2&a…

JavaScript 语句

文章目录JavaScript 语句JavaScript 语句分号 ;JavaScript 代码JavaScript 代码块JavaScript 语句标识符JavaScript 语句 JavaScript 语句向浏览器发出的命令。语句的作用是告诉浏览器该做什么。 JavaScript 语句 JavaScript 语句是发给浏览器的命令。 这些命令的作用是告诉浏…

顶象入选信通院“数字政府建设赋能计划”成员单位

为进一步推动数字政府建设提质增效&#xff0c;由中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;联合数字政府相关企业、科研机构共同成立“数字政府建设赋能计划”&#xff0c;旨在凝聚各方力量&#xff0c;整合优质资源&#xff0c;开展技术攻关&#xf…

FlinkSQL基本语法和概念

Flink Sql1、简介2、网址3、SQL客户端4、Queries5、Create6、Drop7、Alter8、Insert9、ANALYZE10、Describe11、Explain12、Use13、Show14、Load15、Unload16、Set17、Reset18、Jar19、Windowing TVF19.1、TUMBLE&#xff08;滚动窗口&#xff09;19.2、HOP&#xff08;滑动窗口…

rabbitmq+netcore6 【2】Work Queues:一个生产者两个消费者

文章目录1&#xff09;准备工作2&#xff09;新建消费者13&#xff09;新建消费者24&#xff09;生产者5&#xff09;知识点解读1、autoAck: true2、重复声明/前后不一致3、Message durability 消息持久化4、Fair Dispatch 公平调度5、综合以上知识点的代码&#xff1a;官网参考…

Linux的运行级别

Linux的运行级别: Linux系统有7种运行级别(runlevel): 运行级别 0&#xff1a;系统停机状态&#xff0c;系统默认运行级别不能设为0&#xff0c;否则不能正常启动运行运行级别 1&#xff1a;单用户工作状态&#xff0c;root权限&#xff0c;用于系统维护&#xff0c;找回丢失…

少儿Python每日一题(9):约瑟夫环

原题解答 本次的题目如下所示(原题出处:蓝桥杯) 【编程实现】 有n个人围成一个圈,按顺序排好号。然后从第一个人开始报数(从1到3 报数),报到3的人退出圈子,然后继续从1到3报数,直到最后留下一个 人游戏结束,问最后留下的是原来第几号。 输入描述:输入一个正整数n 输…

国际手机号码检查纠正 API 接口

国际手机号码检查纠正 API 接口 有效性检查及智能纠正&#xff0c;遵循 E.164 标准&#xff0c;智能统一格式。 1. 产品功能 智能检测国际手机号码有效性&#xff1b;可根据提供的国家编码参数&#xff0c;判断提供的手机号码是否为该国家有效手机号码&#xff1b;智能纠正提…

场景题:假设10W人突访,你的系统如何做到不 雪崩?

文章很长&#xff0c;而且持续更新&#xff0c;建议收藏起来&#xff0c;慢慢读&#xff01;疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 &#xff1a; 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

头歌:Ping服务端创建UDP套接字(底部附全关完整答案)

头歌实践教学平台 (educoder.net)在 Ping 的 服务程序中 创建一个使用 UDP 协议的 套接字数据包套接字类型套接字三种类型:流式套接字(SOCK_STREAM)&#xff0c;数据包套接字(SOCK_DGRAM)及原始套接字&#xff08;SOCK_RAW&#xff09;数据包格式套接字&#xff08;Datagram So…

JavaSE---多用户网络通信系统

目录 项目开发流程 多用户网络通信系统的架构设计 客户端 界面层 服务层 管理层 服务端 服务层 功能层 管理层 总结 项目开发流程 多用户网络通信系统的架构设计 整体 作为一个可供多个用户使用的通信系统&#xff0c;那么每个用户和其他用户之间的连接必定不是直接…

电脑宽带连接提示错误代码769怎么办?

有用户反映&#xff0c;在使用宽带连接网络时&#xff0c;出现错误代码769&#xff0c;无法连接到指定目标怎么办&#xff1f;这里整理了错误代码769的可能原因和修复方法&#xff0c;带大家顺利连接网络。错误代码769的原因&#xff1a;连接线松动或损坏网卡被禁用网卡驱动过时…

【信息论与编码 沈连丰】第四章:离散信源的信源编码

【信息论与编码 沈连丰】第四章&#xff1a;离散信源的信源编码第四章 离散信源的信源编码4.1 信源编码的模型4.2 信息传输速率和编码效率4.3 单义可译定理4.4 无失真信源编码定理4.5 几种典型的信源编码方法4.6 汉字编码方法及其讨论4.7 图像的信源编码4.8 误码对信源译码的影…