优先队列
优先队列可以在常数时间内取出一个序列的最大值或最小值,以对数阶的时间复杂度插入任意值。但是注意最大值优先队列只能取最大值,而最小值优先队列只能取最小值。
优先队列在算法中的使用新得
而在算法中的使用优先队列通常不会仅仅取出序列的最值,有时候还会让你删除优先队列的任意值(当然这是没法做到的,这是由优先队列的特点决定的)。而在 Leetcode 的天际线和滑动窗口最大值问题的使用优先队列的解中都会提到 “从优先队列中将该值删除” ,这又是为什么呢?
因为这不是真正意义上的删除,而是一种特殊思想 延迟删除——需要保证该值对后续值没有影响后才能出优先队列(这是延迟思想+优先队列的实质)。
换到实际问题,比如天际线,使用 pair<int, int>
保存建筑的最高值和右边缘的 x 坐标——以此来表示一条线段。当遇到建筑的右边缘时,优先队列要取出最大值进行比较时,先判断优先队列该最大值是不是有效的线段(即最大值的 x 坐标是否大于等于该点的 x 坐标,是则有效)。