题目描述
Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen so far as a list of disjoint intervals.
For example, suppose the integers from the data stream are 1, 3, 7, 2, 6, ..., then the summary will be:
[1, 1] [1, 1], [3, 3] [1, 1], [3, 3], [7, 7] [1, 3], [7, 7] [1, 3], [6, 7]
题目大意
将给定地一串正整数数字输入,整合成不相交的区间表示。
示例
如题目所示。
解题思路
LeetCode@Tiejun主要利用set<vector<int>>数据结构来表示不同的区间表示,每次插入新的数字时,遍历set查找可以合并的区间,并同时删除该区间,最后将整合好的区间插入set。
复杂度分析
时间复杂度:O(N)
空间复杂度:O(N)
代码
class SummaryRanges { public: /** Initialize your data structure here. */ SummaryRanges() { } void addNum(int val) { // 初始化新的区间,以新插入的数字为区间的中心点 vector<int> merge = {val, val}; // 遍历set,寻找可以合并的区间 for (auto it = intervals.begin(); it != intervals.end();) { // 如果该区间不与新区间相连,则跳过 if (it->front() - 1 > merge.back() || it->back() + 1 < merge.front()) ++it; // 否则将两个区间合并 else { merge.front() = min(it->front(), merge.front()); merge.back() = max(it->back(), merge.back()); it = intervals.erase(it); } } // 插入新区间 intervals.insert(merge); } vector<vector<int>> getIntervals() { // 将set中的所有元素返回 return vector<vector<int> >(intervals.begin(), intervals.end()); } private: set<vector<int> > intervals; }; /** * Your SummaryRanges object will be instantiated and called as such: * SummaryRanges* obj = new SummaryRanges(); * obj->addNum(val); * vector<vector<int>> param_2 = obj->getIntervals(); */