LeetCode 1801. 积压订单中的订单总数(C++)

2023-10-29

思路:
该题主要是对比销售、采购的价格来进行数组\队列的pop和push操作来实现;采用优先队列来实现排序,其中销售和采购对应小队列和大队列
对于 销售 操作;如果采购的积压订单中有出价格比自己的销售价格高,就出
对于 采购 操作:如果销售的订单中有出价比自己的采购价格还低,就买
原题链接:https://leetcode.cn/problems/number-of-orders-in-the-backlog/description/

1.题目如下:

给你一个二维整数数组 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

2.代码如下:

class Solution {
public:
// 思路一: 优先队列实现
/*
    该题主要是对比销售、采购的价格来进行数组\队列的pop和push操作来实现
    采用优先队列来实现排序,其中销售和采购对应小队列和大队列
    对于 销售 操作;如果采购的积压订单中有出价格比自己的销售价格高,就出
    对于 采购 操作:如果销售的订单中有出价比自己的采购价格还低,就买
*/
    int getNumberOfBacklogOrders(vector<vector<int>>& orders) {
        const int MOD = 1e9+7;
        // 两个优先队列来实现排序   采购订单使用大堆  销售订单采用小堆
        priority_queue<pair<int, int>,vector<pair<int, int>>,less<pair<int, int>>> buyOrders;
        priority_queue<pair<int, int>,vector<pair<int, int>>,greater<pair<int, int>>> sellOrders;
        for (auto &order:orders) {
            int price=order[0];
            int amount=order[1];
            int orderType=order[2];
            // 如果是采购订单
            if (orderType==0) {
                // 如果我的采购价格大于目前的最低售卖价格,就可以成交,
                while (amount>0 && !sellOrders.empty() && sellOrders.top().first<=price) {
                	//销售积压订单数量
                    auto sellOrder=sellOrders.top();
                    sellOrders.pop();
                    // 成交量取决于较小数
                    int sellAmount=min(amount,sellOrder.second);
                    amount-=sellAmount;
                    sellOrder.second-=sellAmount;
                    // 如果没有销售空,而且采购订单中没有比销售单价更高的了就放入销售队列
                    // 采购完成,销售的剩余的数量放回
                    if (sellOrder.second>0) {
                        sellOrders.push(sellOrder);
                    }
                }
                // 检查是否采购完
                if (amount>0) {
                    buyOrders.emplace(price,amount);
                }
            }
            // 如果是销售订单 
            else {
                // 当我的销售金额比采购金额还要小时,就自动达成交易
                while (amount>0 && !buyOrders.empty() && buyOrders.top().first>=price) {
                    auto buyOrder=buyOrders.top();
                    buyOrders.pop();
                    // 销售数量 等于两者中较小者
                    int buyAmount=min(amount,buyOrder.second);
                    amount-=buyAmount;
                    buyOrder.second-=buyAmount;
                    if (buyOrder.second>0) {
                        buyOrders.push(buyOrder);
                    }
                }
                // 更新
                if (amount>0) {
                    sellOrders.emplace(price,amount);
                }
            }
        }
        int total=0;
        // 计算所有积压的订单数目
        while(!buyOrders.empty()) {
            total=(total+buyOrders.top().second)%MOD;
            buyOrders.pop();
        }
        while(!sellOrders.empty()) {
            total=(total+sellOrders.top().second)%MOD;
            sellOrders.pop();
        }
        return total;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode 1801. 积压订单中的订单总数(C++) 的相关文章

随机推荐

  • 如何判断某个值更改就让按钮可用_【教程】 如何创建自己的 NFT? 这里有份教程, 请收下!...

    AtomicHub 提供了 NFT 创建工具 让任何人都可以创建自己的 NFT 非同质代币 喜欢 NFT 的小伙伴们 一起搞起来吧 除了 WAX 之外 目前 AtomicAssets 也支持了 EOS 区块链 所以 两条链上的朋友都可以参考
  • pandas的定义以及pandas的DataFrame的初步使用(二)

    补充 Series自动对齐 当多个series对象之间进行运算的时候 如果不同series之间具有不同的索引值 那么运算会自动对齐不同索引值的数据 如果某个series没有某个索引值 那么最终结果会赋值为NaN 示例 DataFrame对象
  • 计算机网络c类网络划分子网介绍,IP地址的子网划分详解

    原标题 IP地址的子网划分详解 来源 今日头条北京炫亿时代 一 子网划分基础 1 子网划分的若干个好处 减少网络流量 提高网络性能 简化管理 可以更为灵活的形成大覆盖范围的网络 2 你最好遵循以下步骤来进行子网划分 确认所需要的网络ID数
  • 文件分片上传demo

    知识点 File File 接口也继承了 Blob 接口的属性 File 接口没有定义任何方法 但是它从 Blob 接口继承了以下方法 Blob slice start end contentType new File 字符串数组 file
  • 【C语言】错题本(4)

    一 题目及选项 答案解析 知识点 字符型在内存中的数据存储 char类型数据在内存中的图示 unsigned char类型数据在内存中的图示 二 题目及选项 答案解析 A B C D 三 题目及选项 答案解析 数据在计算机中是先转换成补码
  • @ApiImplicitParam注解使用说明

    ApiImplicitParam注解使用说明 ApiImplicitParam是Swagger框架中的一个注解 用于描述请求参数的详细信息 它可以帮助开发人员生成API文档 并提供给用户更清晰的接口信息 以下是对 ApiImplicitPa
  • 别再乱写了,Controller 层代码这样写才足够规范!

    前言 本篇主要要介绍的就是controller层的处理 一个完整的后端请求由4部分组成 接口地址 也就是URL地址 请求方式 一般就是get set 当然还有put delete 请求数据 request 有head跟body 响应数据 r
  • Deep learning:四十一(Dropout简单理解)

    前言 训练神经网络模型时 如果训练样本较少 为了防止模型过拟合 Dropout可以作为一种trikc供选择 Dropout是hintion最近2年提出的 源于其文章Improving neural networks by preventin
  • 马哥:linux云计算从入门到精通笔记

    前言 Linux可安装在各种计算机硬件设备中 比如手机 平板电脑 路由器 视频游戏控制台 台式计算机 大型机和超级计算机 互联网Linux运维工作 以服务为中心 以稳定 安全 高效为三个基本点 确保公司的互联网业务能够7 24小时为用户提供
  • 密码复杂度(四选三)

    密码复杂度 四选三 数字 大写字母 小写字母 特殊字符 四种里边任选其三 0 9 lt gt A Z W a z W 0 9a z A Z0 9 0 9 lt gt a zA Z a zA Z0 9 lt gt 8 32
  • java 有序列表_Java 中的 List —— 有序序列

    List 在 java 中是个有序序列 一 容量 ArrayList 中有一个容量概念 表示基础数组的大小 无参时默认为 10 在需要的时候 比如 add操作 会自动增加其容量 LinkedList 没有这个概念 TreeMap 也有容量
  • SpringBoot忽略HTTPS请求的SSL证书

    报错如下 java security cert CertificateException No subject alternative names present 解决方案 1 创建SslUtil工具类 import java securi
  • FreeRTOS移植到STM32F103

    1 下载FreeRTOS源码 官网 FreeRTOS官网 下载第一个带有示例的 2 在基础工程文件中创建文件夹FreeRTOS 3 打开下载好的源码 将FreeRTOSv202212 01 FreeRTOS Source 里面的两个文件夹和
  • 软中断 简介

    前言 中断服务程序往往实在CPU关中断的条件下执行的 以避免中断嵌套而使控制复杂化 但是CPU关中断的时间不能太长 否则会丢失中断信号 因此Linux将中断服务程序分为 上半部 和 下半部 前者对时间要求比较严格 必须在中断请求发生后立即
  • linux底线模式,linux编辑命令vi

    vi vim 的使用 基本上 vi vim 共分为三种模式 分别是命令模式 Command mode 输入模式 Insert mode 和底线命令模式 Last line mode 命令模式 以vi打开一个文件就直接进入一般模式了 这是默认
  • Modbus CRC和LRC算法研究及代码实现

    一 CRC 循环冗余校验 1 CRC16实现流程 XOR 异或 N 字节的信息位 POLY CRC16 多项式计算 1010 0000 0000 0001 生成多项式 1 x2 x15 x16 在CRC16中 发送的第一个字节位低字节 2
  • VsCode 搭建 Java 开发环境

    前提 已经安装 jdk 一 vscode 安装插件 1 点击扩展 Ctrl Shift X 2 搜索查找 Java Extension Pack 3 点击安装 注意如果是 jdk 11 可以直接安装 如果是 jdk 8 那么需要先安装 La
  • CAD怎么查询面积

    第一步 打开cad图形 在菜单栏 点击 工具 第二步 调出工具选项 用鼠标指着 查询Q 激活查询命令 第三步 弹出查询的更多功能选项 点击 面积 第四步 这时候使用鼠标拾取需要查询的围成面积的各个关键点 第五步 拾取各个点 围成一个 封闭图
  • Python实验--手写五折交叉验证+调库实现SVM/RFC/KNN手写数字识别

    1 数据读取 先说一下要用到的数据集 数据集自取地址 链接 https pan baidu com s 1Vd2ADHEalSNnuOEcPJD8gQ 提取码 3hk6 数据集构成 0 9十个数字 总共1934个样本 以数字 n命名 每个样
  • LeetCode 1801. 积压订单中的订单总数(C++)

    思路 该题主要是对比销售 采购的价格来进行数组 队列的pop和push操作来实现 采用优先队列来实现排序 其中销售和采购对应小队列和大队列 对于 销售 操作 如果采购的积压订单中有出价格比自己的销售价格高 就出 对于 采购 操作 如果销售的