题目描述

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

题解

题目不难,主要是要读懂题意,一步步模拟,代码较长,需要细心检查。

坑较多,比如我犯了很多傻逼问题:想都不想就拿1<<9+7当作1000000007,更傻逼的是,<<的优先级低于+号,<<都没用对。

实时取最大和最小,可以用堆或者优先队列实现。这里我使用了Java的TreeMap。

class Solution {
public static int getNumberOfBacklogOrders(int[][] orders) {
TreeMap<Integer,Long> sells = new TreeMap<>();//价格:数量
TreeMap<Integer,Long> buys = new TreeMap<>();//价格:数量
for(int i=0;i<orders.length;i++){
if(orders[i][2]==0){//buy
long curBuyAmount = orders[i][1];
int buyPrice = orders[i][0];
while (curBuyAmount>0){
if(sells.isEmpty()){
buys.put(buyPrice,buys.getOrDefault(buyPrice,0l)+curBuyAmount);//添加剩余的订单到积压订单
break;
}
if(sells.firstKey()<=buyPrice){
if(curBuyAmount<sells.get(sells.firstKey())){
sells.put(sells.firstKey(),sells.get(sells.firstKey())-curBuyAmount);
curBuyAmount = 0;
}else{
curBuyAmount -= sells.get(sells.firstKey());
sells.remove(sells.firstKey());
}
}else{
buys.put(buyPrice,buys.getOrDefault(buyPrice,0l)+curBuyAmount);//添加剩余的订单到积压订单
break;
}
}
}else{//sell
long curSellAmount = orders[i][1];
int sellPrice = orders[i][0];
while (curSellAmount>0){
if(buys.isEmpty()){
sells.put(sellPrice,sells.getOrDefault(sellPrice,0l)+curSellAmount);
break;
}
if(buys.lastKey()>=sellPrice){
if(curSellAmount<buys.get(buys.lastKey())){
buys.put(buys.lastKey(),buys.get(buys.lastKey())-curSellAmount);
curSellAmount = 0;
}else{
curSellAmount -= buys.get(buys.lastKey());
buys.remove(buys.lastKey());
}
}else{
sells.put(sellPrice,sells.getOrDefault(sellPrice,0l)+curSellAmount);//添加剩余的订单到积压订单
break;
}
}
}
}
long mod = 1000000007;
long overStockNum = 0;
for(Long i:buys.values()){
overStockNum = (overStockNum + i)%mod;//实时取模
}
for(Long i:sells.values()){
overStockNum = (overStockNum + i)%mod;
}
return (int)(overStockNum%mod);
}
}

堆&&优先队列&&TreeMap的更多相关文章

  1. 纯数据结构Java实现(6/11)(二叉堆&优先队列)

    堆其实也是树结构(或者说基于树结构),一般可以用堆实现优先队列. 二叉堆 堆可以用于实现其他高层数据结构,比如优先队列 而要实现一个堆,可以借助二叉树,其实现称为: 二叉堆 (使用二叉树表示的堆). ...

  2. Running Median POJ - 3784 (对顶堆/优先队列 | 链表)

    For this problem, you will write a program that reads in a sequence of 32-bit signed integers. After ...

  3. POJ 2442 - Sequence - [小顶堆][优先队列]

    题目链接:http://poj.org/problem?id=2442 Time Limit: 6000MS Memory Limit: 65536K Description Given m sequ ...

  4. 【bzoj2151】种树(堆/优先队列+双向链表)

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2151 这道题因为优先队列不怎么会用,而且手写堆的代码也不长,也想复习一下手写堆的写法…… ...

  5. poj 1442 Black Box(堆 优先队列)

    题目:http://poj.org/problem?id=1442 题意:n,m,分别是a数组,u数组的个数,u[i]w为几,就加到a几,然后输出第i 小的 刚开始用了一个小顶堆,超时,后来看了看别人 ...

  6. 算法&数据结构系列 -- 堆(优先队列)

    前言 话说新开的博客十分好用... 所以,我打算开一个坑,名曰[算法系列]. 什么意思--从名字泥应该就猜得出来... 废话不多说,进入正文~~ 正文 原理 首先,堆是一颗棵二叉树.. 其次,堆是一棵 ...

  7. [luoguP1631] 序列合并(堆 || 优先队列)

    传送门 首先,把A和B两个序列分别从小到大排序,变成两个有序队列.这样,从A和B中各任取一个数相加得到N2个和,可以把这些和看成形成了n个有序表/队列: A[1]+B[1] <= A[1]+B[ ...

  8. P1168 中位数[堆 优先队列]

    题目描述 给出一个长度为NNN的非负整数序列AiA_iAi​,对于所有1≤k≤(N+1)/21 ≤ k ≤ (N + 1) / 21≤k≤(N+1)/2,输出A1,A3,…,A2k−1A_1, A_3 ...

  9. 剑指 Offer 41. 数据流中的中位数 + 堆 + 优先队列

    剑指 Offer 41. 数据流中的中位数 Offer_41 题目详情 题解分析 本题使用大根堆和小根堆来解决这个寻找中位数和插入中位数的问题. 其实本题最直接的方法是先对数组进行排序,然后取中位数. ...

随机推荐

  1. 如果你想设置无人自动升级,我们推荐你将这个值修改为security,它会告诉 yum 仅仅升级修复安全问题的软件包。

    定期升级你的 CentOS 系统,是所有系统安全中最重要的措施之一.如果你不使用最新的安全补丁升级你的操作系统软件包,你将会让你的机器很容易被攻击. 如果你管理者多个 CentOS 机器,手动升级系统 ...

  2. 11.13 ethtool:查询网卡参数

    ethtool命令用于查询或设置网卡参数. ethtool [devname] [root@linuxprobe ~]# ethtool eth0 Settings for eth0:  Suppor ...

  3. 存储单位 KB MB bit

  4. Jquery ajax 详解(Day_16)

    太在意别人的看法最后会有两种结局,要么自己累死,要么让别人整死. 简介 AJAX 是与服务器交换数据的技术,它在不重载全部页面的情况下,实现了对部分网页的更新. 简短地说,在不重载整个网页的情况下,A ...

  5. 重新整理 .net core 实践篇—————配置文件之环境配置[九]

    前言 在当今在互联网微服务比较适用的情况下,docker 可以说一个利器.每次我们打包docker的时候都是适用docker 的配置文件,那么配置文件里面会设置环境变量,这个时候需要我们的应用能够识别 ...

  6. 快速上手 Linkerd v2 Service Mesh(服务网格)

    在本指南中,我们将引导您了解如何将 Linkerd 安装到您的 Kubernetes 集群中. 然后我们将部署一个示例应用程序来展示 Linkerd 的功能. 安装 Linkerd 很容易.首先,您将 ...

  7. 内建函数 iter()

    可以选择接受一个无参的可调用对象以及一个哨兵(结束)作为输入.当已这种方式使用时,iter()会创建i一个迭代器,然后重复调用用户提供的可调用对象,直到返回哨兵的值为止. import sys wit ...

  8. 记录: 解决 pycurl: libcurl link-time ssl backend (openssl) is different from compile-time ssl backend (none/other)

    - Mac 不知道怎么操作的 rm 了 usr/local/ 里面的某些文件, 导致一直出现 pycurl: libcurl link-time ssl backend (openssl) is di ...

  9. 学习Python中出现的错误集合(不定时更新)jupyter平台

    出现的问题:1. 本图的错误,一个是line 7 init的两侧应该是是双下划线"__"导致所示错误 2. 本图的错误是 line 12 Student.student_tatal ...

  10. Sqlserver语句获取本周、上一周、本月数据

    sql语句获取本周.上一周.本月数据 获取周数据 1 本周 2 select * from table1 where datediff(week,时间字段,getdate()) = 0 3 上周 4 ...