2023.01/1801. 积压订单中的订单总数

news2024/11/17 19:48:20

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

题意:

给你一个二维整数数组 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 <= 105
  • orders[i].length == 3
  • 1 <= pricei, amounti <= 109
  • orderTypei 为 0 或 1

解题思路:

  • 需要注意的是:
    • 如果该订单是一笔采购订单 buy ,则可以查看积压订单中价格 最低 的销售订单 sell 。
    • 如果该订单是一笔销售订单 sell ,则可以查看积压订单中价格 最高 的采购订单 buy 。
  • 上面两点说明是用最大的订单来抵消的,所以每次都用最大的订单来匹配即可.
    • 比如当前是buy订单,那么用积压订单中最低的sell订单的价格来比较,如果最低的价格高于buy订单,那么后续的订单不需要再比较了.因为不可能存在小于当前buy订单的价格.
    • sell订单同理.所以实际上就比较了一次.
    • 如何每次都用最低的sell订单和最高的buy订单来比较,这时候就能联想到优先队列,它就能确保获取的订单一直是当前数据中的最大或者最小
    • 如果当前的订单不够抵消怎么办呢?.那就需要把剩余的压入自己的队列中
  • 思路就很清晰了:
    • 用两个优先队列来分别存储订单,sell是每次都用最低的价格,所以用小根堆.同理,buy用大根堆.
    • 遍历订单,判断是否有匹配项.
      • 如果当前订单不匹配,后续不需要再比较,一定不匹配.
      • 如果当前订单匹配,后续订单一定匹配.持续匹配订单直到没有订单匹配
      • 判断是否还要剩余订单,如果有就加入自己的队列,如果没有就看下一个订单

代码:

class Solution {
public:
int getNumberOfBacklogOrders(vector<vector<int>>& orders)
{
	int mod = 1e9 + 7;
	priority_queue<pair<int,int>,vector<pair<int,int>>, less<pair<int,int>>> bque;			//buy订单,大根堆
	priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> sque;	//sell订单,小根堆

	for (const auto &it : orders)
	{
		int one = it[0];
		int two = it[1];
		if (it[2] == 0)
		{
 			while (!sque.empty() && two > 0 && sque.top().first <= one)		//如果最大的buy单的价格都无法满足当前sell的价格,那么不需要遍历了.
			{
				auto top = sque.top();
				sque.pop();
				if (top.second > two)	//一直减到单子数量没有或者没有匹配单子为止
				{
					top.second -= two;
					sque.push(top);
					two = 0;

				}
				else if (top.second == two)
					two = 0;
				else
					two -= top.second;
			}
			if (two != 0)						//没有匹配单子,还剩下就压入队列
				bque.push({ one,two });
		}
		else
		{
			while (!bque.empty() && two > 0 && bque.top().first >= one)		//如果最小的sell单价格都无法满足当前buy的价格,也不需要在遍历
			{
				auto top = bque.top();
				bque.pop();
				if (top.second > two)			//一直减到单子数量没有或者没有匹配单子为止
				{
					top.second -= two;
					bque.push(top);
					two = 0;

				}
				else if (top.second == two)
					two = 0;
				else
					two -= top.second;
			}
			if (two != 0)					//没有匹配单子,还剩下就压入队列
				sque.push({ one,two });
		}
	}
	unsigned long long size = 0;		//遍历两个队列获取剩下单子数
	while (!bque.empty())
	{
		size += bque.top().second;
		bque.pop();
	}
	while (!sque.empty())
	{
		size += sque.top().second;
		sque.pop();
	}
	return size % mod;
}
};

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

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

相关文章

3D打印:FDM打印使用CURA4.13.1版本配置

一、前言 今天是2023年1月1日&#xff0c;新年阳历的第一天&#xff0c;在整理CSDN和写年度计划&#xff0c;对2022的总结&#xff0c;就像写一篇博客来分享一下我2022年积累的最多的一项经验&#xff0c;就是使用3D打印机&#xff0c;在2022年我先后入手了3台3d打印机&#x…

聊聊数字化转型是个啥

“国有企业首要的职责&#xff0c;就是实现国有资产保值增值。这是衡量国企工作优劣的关键&#xff01;” ——李克强 如果你开了一家制衣厂&#xff0c;雇佣了10个员工买了10台缝纫机&#xff0c;假设一天可以生产100件衣服。 做老板的你想要提高这家工厂的生产数量&#xff0…

禾元生物冲刺科创板上市:累计亏损超4亿元,贝达药业为主要股东

12月30日&#xff0c;武汉禾元生物科技股份有限公司&#xff08;下称“禾元生物”&#xff09;在上海证券交易所递交招股书&#xff0c;准备在科创板上市。本次冲刺上市&#xff0c;禾元生物计划募资35.02亿元&#xff0c;将用于植物源重组人血清白蛋白产业化基地建设项目、新药…

更多的可能

1986年12月&#xff0c;路遥的《平凡的世界》出版了&#xff0c;1992年11月17日路遥去世了&#xff0c;享年43岁&#xff0c;距今30年了……人的一生常常是白驹过隙&#xff0c;忽然而已&#xff0c;人们也常常用星空里的流星比喻&#xff0c;细细想来&#xff0c;这还算是夸张…

IDEA集成Gitee,超简单

1. 在IDEA下载Gitee插件 file-Settings-Plugins搜索Gitee&#xff0c;并且install这样IDEA就集成了Gitee 2. 从远程仓库拉取项目 如果打开IDEA已经有项目了&#xff0c;那就先file-close退出&#xff0c;回到这个初始化页面VCS&#xff1a;version control system版本控制系…

怎样提升go中的RSA解密速度2~3倍

背景 我们的业务中大量的使用了RSA加密后的数据包&#xff0c;每个数据包大概17-30K不等&#xff0c;因为从php迁移到go,RSA解密业务是无法避免的&#xff0c;之前一直以为迁移后go的解密速度即使没有php快&#xff0c;但也应该相同因此使用了go中x509.ParsePKCS1PrivateKey和…

公务员国考省考小白需知

文章目录&#xff1a; 一&#xff1a;分类 国考 省考 二&#xff1a;必备途径 1.相关网站 1.1 官网 1.2 机构 1.3 时事 1.4 资源 2.相关公主号 3.应用 三&#xff1a;相关需知 1.考试内容 2.老师选择 3.相关 4.公务员行政级别划分表 一&#xff1a;分类 国考…

嵌入式:ARM最小系统设计详解

文章目录一、什么是最小系统最小系统结构框图最小系统例板嵌入式最小系统硬件功能二、时钟和功率管理( 一 ) 时钟管理1、时钟电路结构2、锁相环 PLL( 二 ) 功率管理正常模式空闲模式低速模式掉电模式三、电源电路设计四、复位电路设计五、JTAG电路六、存储器扩展特性存储器映射…

程序员面试金典8.*

文章目录8.1三步问题8.2迷路的机器人8.3魔术索引8.4求幂集8.5递归乘法8.6 汉诺塔8.7无重复字符串的排列组合(☆)8.8有重复字符的排列组合8.9括号8.10颜色填充8.11硬币8.12八皇后8.1三步问题 一个基础的动态规划问题&#xff0c;pass dp[i]dp[i-1] dp[i-2] dp[i-3] dp[1]1, dp[…

linux系统中串口驱动的基本实现原理

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何利用linux系统中的串口驱动。 目录 第一&#xff1a;linux系统中UART驱动框架 第二&#xff1a;uart_ops的具体实现 第三&#xff1a;串口驱动设备树的添加 第一&#xff1a;linux系统中UART驱动框架 向SPI一样&am…

ansible第二天作业

## 安装并且配置ansible 1)安装和配置ansible以及ansible控制节点server.example.com如下&#xff1a; 2)创建一个名为/home/student/ansible/inventory的静态库存文件如下所示&#xff1a; 2.1)node1 是dev主机组的成员 2.2)node2是test主机组的成员 2.3)node1和node2是prod主…

【JAVA】生产消费者问题

生产者/消费者问题是一个共享资源的问题&#xff0c;即生产者生产的产品不能超过最大存储量&#xff0c;而消费者消费的产品不能多于剩下的产品数量。 解决方法有很多种&#xff0c;这里通过同步线程锁&#xff1a; synchronized 但是仅仅使用线程锁是不足的&#xff0c;因为…

ElasticsSearch7.6.1学习笔记【狂神说Java】

文章目录一、ElasticSearch概述二、安装elasticsearch-7.6.1&#xff0c;基于windows 101、解压安装包以及目录结构介绍2、安装可视化插件elasticsearch-head3、解决跨域问题三、安装Kibana四、核心概念五、IK分词器插件1、什么是ik分词器2、解压3、进入kibana测试4、自定义扩展…

状态压缩DP——蒙德里安的梦想

状态压缩DP——蒙德里安的梦想一、题目描述二、思路分析1、状态表示——状态压缩2、状态转移3、循环4、初始化三、代码一、题目描述 二、思路分析 这道题中&#xff0c;其实刚一看是非常的抽象的&#xff0c;也是非常麻烦的。麻烦的点在于我们既需要考虑横着放的方块&#xff…

【Linux】shell命令以及运行原理和Linux权限的理解

&#x1f680; 作者简介&#xff1a;一名在后端领域学习&#xff0c;并渴望能够学有所成的追梦人。 &#x1f40c; 个人主页&#xff1a;蜗牛牛啊 &#x1f525; 系列专栏&#xff1a;&#x1f6b2;Linux &#x1f4d5; 学习格言&#xff1a;博观而约取&#xff0c;厚积而薄发 …

VBA之正则表达式(39)-- 提取规格数据(2/2)

实例需求&#xff1a;A列为某产品名称&#xff0c;现需要提取其中的规格数据&#xff0c;具体规则如下&#xff1a; 规格数据以如下关键字开头&#xff1a;RO、RE、SQ、SD、QD、OB、HX、ET、QR、D2规则数据可能有多段&#xff08;截图中红色部分&#xff09;提取规格数据之后&…

SpringBoot简单功能分析,静态资源访问和静态资源配置原理解析

目录 1、SpringMVC自动配置概览 2、简单功能分析 2.1、静态资源访问 1、静态资源目录 2、静态资源访问前缀 3、webjar 2.2、欢迎页支持 2.3、自定义 Favicon 2.4、静态资源配置原理 1、SpringMVC自动配置概览 官网Web (spring.io) Spring Boot provides auto-configur…

论文综述——UNIRE: A Unified Label Space for Entity Relation Extraction

UNIRE: A Unified Label Space for Entity Relation Extraction1 任务介绍2 UniRE模型3 实验4 总结1 任务介绍 过构建标签空间来对实体和关系进行联合抽取的方法。 实体关系抽取旨在提取文本中的实体并检测它们的实体类型&#xff0c;以及对每个实体对检测它们的关系。作者提…

MAX78000FTHR简单介绍与初次上手

特点 MAX78000FTHR是基于MAX78000的小型板微控制器单元&#xff08;MCU&#xff09;。 该 MCU 面向在边缘运行的人工智能 (AI) 应用程序。在这种情况下&#xff0c;“边缘”并不意味着技术的前沿&#xff08;尽管这就是芯片&#xff09;&#xff1b;这意味着靠近需要它的地方…

vector对于自定义类型的操作(memcpy浅拷贝问题)

目录 如果对于不涉及资源管理的自定义类型的操作&#xff08;Date&#xff09;&#xff1a; 对涉及资源管理类操作&#xff08;String&#xff09;&#xff1a; 一、插入四个元素&#xff08;代码正常编译没有任何资源泄露问题&#xff09; 二、当插入第五个元素时&#xf…