首先分析一下区间类问题:
- 一般都有时间顺序,
- 有开始和结束。
- 是一个vector,包含了这些开始时间和结束时间
解法总结:
- 最容易想到的就是要对时间进行排序。可能是对开始时间进行排序,也可能是对结束时间进行排序。 比如meeting room, 问一个人能不能参加所有meeting,只需要对开始时间进行排序,然后检查前面的结束,和后面的开始是不是冲突就能解决了。
- 扫描线算法,碰到一个start就+1, 碰到一个end就-1。 这个算法挺简单,可以想象成同时有多少会议在进行,开始一个就加一,结束一个就减一。 最大值就是meeting room ii 的答案,最多需要多少meeting room。
- 在排序之上,比如meeting room ii,用priority queue,对结束时间进行排序,然后就按照开始时间一个个对比。我们的目标是让pq记录在用的会议室的结束时间。 所以最后pq的size就是我们要的答案。
- 如果当前开始时间比pq上最早的结束时间要晚,那说明这两个可以共用一个会议室呀。那就pop掉这个结束时间,push 上新的结束时间。pq的长度不变。
- 如果当前开始时间小于pq上最早时间,那说明会议室不够用了,连最早结束时间都满足不了,其他肯定也不行,直接push上新的结束时间。pq长度+1
- 一直到最后一个区间,pq长度在这段时间只增加不减少。
4. 贪心算法:始终选择具有最早结束时间的区间。然后就能获得最大数量的不重叠区间。因为具有最早结束时间的区间产生了最大的容纳其余区间的能力。
- 比如当前剩余区间的最早结束时间是x。可用于其他区间的时间段就是[x:]。如果我们选择另一个结束时间为y的区间,那么可用时间段将变为[y:]。由于x ≤ y,因此没有办法使[y:]比[x:]容纳更多的区间。所以这个贪心算法可以hold。
- 因此可以按结束时间对区间进行排序,并跟踪当前最早的结束时间。一旦下一个区间的开始时间早于当前结束时间,我们就必须移除一个区间。否则,就更新最早的结束时间。
56. Merge Intervals 中等题 面试出现28次