题目要求:对每个数据包,在其右侧找到第一个同时满足「weight 相等且 priority 严格更大」的数据包,输出它的 1-based 编号,找不到则输出 0。
核心观察:条件 2 要求 weight 相等,因此「右侧第一个更优数据包」只可能在同权重的数据包之间产生。我们可以按 weight 把数据包分组,问题随即退化为:在每一组内,对每个元素求右侧第一个 priority 更大的元素(经典的「下一个更大元素」问题)。
算法选择:单调栈(Monotonic Stack)。
在数据包传输系统中,为了优化网络带宽利用率,系统需要对数据包序列进行处理,找出每个数据包右侧第一个满足某些条件、优先级更高的数据包。
每个数据包的格式为:<priority>:<weight>,其中:
<priority> 是数据包的优先级(正整数,1 ≤ priority ≤ 10^5,数值越大优先级越高)<weight> 是数据包的权重(正整数,1 ≤ weight ≤ 10^5)系统需要按照以下规则处理数据包:搜索整个数据包序列(从左到右),对于每个数据包,找出其右侧第一个同时满足如下条件的数据包:
priority 必须大于当前数据包的 priorityweight 必须等于当前数据包的 weight请编写一个方法,实现数据包右侧第一个满足条件的数据包查找功能。
参数 packets:数据包内容,长度为 n(正整数,1 ≤ n ≤ 10^5)的数组,每个元素为 [priority, weight]。
右侧第一个满足条件的数据包 ID 组成的数组序列;数据包 ID 是其在数组中的位置,即第 i 个数据包的 ID 为(从 1 开始计数,非数组下标 0);如果某个数据包右侧没有满足条件的数据包,则输出 0。
输入
[[5,10],[6,10],[4,10]]
输出
[2,0,0]
说明
数据包序列:[[5,10],[6,10],[4,10]]
[5,10] 右侧搜索:
[6,10]:priority(6) > 5,weight(10) 相同,满足条件,输出 2(非数组下标 1)[6,10] 右侧搜索:
[4,10]:priority(4) < 6,不满足条件,跳过[4,10] 右侧搜索:
[2,0,0]输入
[[5,10],[7,22]]
输出
[0,0]
说明
数据包序列:[[5,10],[7,22]]
[5,10] 右侧搜索:
[7,22]:priority(7) > 5,weight(22) ≠ 10,不满足[7,22] 右侧搜索:
[0,0]
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册