题目描述

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

题解

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

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

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

  1. class Solution {
  2. public static int getNumberOfBacklogOrders(int[][] orders) {
  3. TreeMap<Integer,Long> sells = new TreeMap<>();//价格:数量
  4. TreeMap<Integer,Long> buys = new TreeMap<>();//价格:数量
  5. for(int i=0;i<orders.length;i++){
  6. if(orders[i][2]==0){//buy
  7. long curBuyAmount = orders[i][1];
  8. int buyPrice = orders[i][0];
  9. while (curBuyAmount>0){
  10. if(sells.isEmpty()){
  11. buys.put(buyPrice,buys.getOrDefault(buyPrice,0l)+curBuyAmount);//添加剩余的订单到积压订单
  12. break;
  13. }
  14. if(sells.firstKey()<=buyPrice){
  15. if(curBuyAmount<sells.get(sells.firstKey())){
  16. sells.put(sells.firstKey(),sells.get(sells.firstKey())-curBuyAmount);
  17. curBuyAmount = 0;
  18. }else{
  19. curBuyAmount -= sells.get(sells.firstKey());
  20. sells.remove(sells.firstKey());
  21. }
  22. }else{
  23. buys.put(buyPrice,buys.getOrDefault(buyPrice,0l)+curBuyAmount);//添加剩余的订单到积压订单
  24. break;
  25. }
  26. }
  27. }else{//sell
  28. long curSellAmount = orders[i][1];
  29. int sellPrice = orders[i][0];
  30. while (curSellAmount>0){
  31. if(buys.isEmpty()){
  32. sells.put(sellPrice,sells.getOrDefault(sellPrice,0l)+curSellAmount);
  33. break;
  34. }
  35. if(buys.lastKey()>=sellPrice){
  36. if(curSellAmount<buys.get(buys.lastKey())){
  37. buys.put(buys.lastKey(),buys.get(buys.lastKey())-curSellAmount);
  38. curSellAmount = 0;
  39. }else{
  40. curSellAmount -= buys.get(buys.lastKey());
  41. buys.remove(buys.lastKey());
  42. }
  43. }else{
  44. sells.put(sellPrice,sells.getOrDefault(sellPrice,0l)+curSellAmount);//添加剩余的订单到积压订单
  45. break;
  46. }
  47. }
  48. }
  49. }
  50. long mod = 1000000007;
  51. long overStockNum = 0;
  52. for(Long i:buys.values()){
  53. overStockNum = (overStockNum + i)%mod;//实时取模
  54. }
  55. for(Long i:sells.values()){
  56. overStockNum = (overStockNum + i)%mod;
  57. }
  58. return (int)(overStockNum%mod);
  59. }
  60. }

堆&&优先队列&&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. 安装oracle 时“[INS-30014]无法检查指定的位置是否位于 CFS上”问题

    错误截图: 错误信息: [INS-30014]无法检查指定的位置是否位于 CFS上 解决方案: 通过修改hosts文件,向C:\Windows\System32\drivers\etc\hosts文件 ...

  2. Pod无法删除 强制删除pod

    多次变更服务后,发现部分pod delete僵死无法删除,一直处于Terminating状态 kubectl delete pod $pod-name一直卡住或不生效 已经删除管理资源的情况下发现仍然 ...

  3. CefSharp如何进行页面的缩放(即Ctrl+滚轮)

    问题:CefSharp如何进行页面的缩放 摘要:由于CefSharp并没有提供鼠标滚轮事件.只有一个KeyboardHandler事件,因此只能接收到键盘事件. 环境:CefShap.Wpf 了解Ce ...

  4. Ubuntu1804下k8s-CoreDNS占CPU高问题排查

    1.背景: 最近在ubuntu804上适配k8s的时候,部署到业务pod的时候,出现了服务器卡死,top查看发现负载很高,进行CPU排序发现如下信息,可知是CoreDNS服务导致. 2. 分析排查: ...

  5. Task类学习教程—组合任务ContinueWith

    Task类学习教程-组合任务.ContinueWith 一.简介 通过任务,可以指定在任务完成之后,应开始运行之后另一个特定任务.ContinueWith是Task根据其自身状况,决定后续应该作何操作 ...

  6. webdriver中的等待——主要讲解WebDriverWait()

    webdriver中的等待--主要讲解WebDriverWait() 强制等待:sleep() 隐式等待:implicitly_wait() 显示等待:WebDriverWait() 与until() ...

  7. c++ 各种数据结构的时间空间复杂度

    普通线段树    时间 log2(n); 空间 n+log2(n)+log4(n)+log(8)n+.....+logn(n)==n*4; 动态开点线段树 时间 log2(n); 空间 q*log2( ...

  8. NOIP模拟5 T2

    题面:求出满足以下条件的 n*m 的 01 矩阵个数:   (1)第 i 行第 1~li 列恰好有 1 个 1 (li+1到ri-1不能放1)   (2)第 i 行第 ri~m 列恰好有 1 个 1. ...

  9. python小知识,字典

    知识融合在代码中 """ create:2020年12月20日 功能:字典的部分使用方法 """ #空字典 dic={} print(&qu ...

  10. PageHelper--Mybatis分页插件(ssm框架下的使用)

    1.导入PageHelper依赖 <!-- MyBatis 分页插件 --> <dependency> <groupId>com.github.pagehelper ...