Sorted_Container/352.Data-Stream-as-Disjoint-Intervals/Readme.md
本题需要一种数据结构,能够每扔进一个元素就能自动排序。我们很容易想到priority_queue。但是我们还需要能够便于查找元素,那么priority_queue就没有办法了,它本质是栈,只能一个一个读取。我们这里采用的是有序集合(ordered set),不仅能实现自动排序,它的lower_bound函数也很好用,可以log(N)地迅速定位查找。需要注意的是,集合的元素在物理内存上并不是连续的,所以迭代器(可以想象成指针)不能任意移动指定数目,只能通过重载的自增自减操作来实现移动。
本题中,集合的元素是自定义结构Interval,所以需要自己写自动比较排序的函数. 集合的定义和自定义比较函数如下:
struct cmp
{
bool operator()(Interval a, Interval b)
{
return a.start<b.start;
}
};
set<Interval,cmp>Set;
每当新进一个元素val,我们可以得到 auto it=Set.lower_bound(val) 表示定位到的指针。注意,根据自定义函数cmp,所有start比it->start严格小的区间都在it位置之前。
程序的主体根据这几种情况来分类考虑:
本题对于Set的迭代器操作要求概念明晰。
将所有的元素都放在一个有序集合Set里,不着急处理。仅当需要输出区间数组时,根据这堆有序数列即时生成。这样就避免了考虑区间合并等复杂的处理。
根据数列生成区间的方法:遍历这个集合,不断更新start和end。当集合元素a!=end+1时,就可以根据start/end生成一个区间;同时更新 start=a, end=a.
使用有序的Map,key是左边界,val是右边界。总体思路和方法1差不多,需要完备考虑各种插入的情况。