文章目录
1. 题目
给定一个非负整数的数据流输入 a1,a2,…,an,…
,将到目前为止看到的数字总结为不相交的区间列表。
例如,假设数据流中的整数为 1,3,7,2,6,…,
每次的总结为:
[1, 1]
[1, 1], [3, 3]
[1, 1], [3, 3], [7, 7]
[1, 3], [7, 7]
[1, 3], [6, 7]
进阶:
如果有很多合并,并且与数据流的大小相比,不相交区间的数量很小,该怎么办?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/data-stream-as-disjoint-intervals
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 题目不难,二分查找 +
if else
就可以了(看找到的位置前后能否合并),见注释
class SummaryRanges {
map<int,int> m; // start, end
public:
/** Initialize your data structure here. */
SummaryRanges() {
}
void addNum(int val) {
if(m.empty()){
m[val] = val;
return;
}
auto it = m.lower_bound(val); // it 的 start >= val
if(it != m.end()) // 后面有区间
{
int start = it->first;
int end = it->second;
if(start == val)
return;
else if(start == val+1) // val 可以 跟 it 区间合并
{
if(it != m.begin()) // it 前面还有区间
{
it--;
int prevStart = it->first;
int prevEnd = it->second;
if(prevEnd+1 == val) // val 可以跟前面合并
{
m.erase(start);//删除后面区间
m[prevStart] = end;//两个区间合并
}
else//不能跟前面合并
{
m.erase(start);
m[val] = end;//更新后面的区间
}
}
else//前面没有区间
{
m.erase(start);
m[val] = end;//更新后面的区间
}
}
else // val 不可以 跟 it 区间合并
{
if(it != m.begin()) // it 前面还有区间
{
it--;
int prevStart = it->first;
int prevEnd = it->second;
if(prevEnd+1 == val)
{ // val 可以跟前面合并
m[prevStart] = val;
}
else if(prevEnd+1 < val)
{ // 前后都不能合并,自己独立
m[val] = val;
}
}
else
{
m[val] = val;
}
}
}
else // 后面没有区间
{
it--;
int prevStart = it->first;
int prevEnd = it->second;
if(prevEnd+1 == val)
{ // 可以跟前面合并
m[prevStart] = val;
}
else if(prevEnd+1 < val)
m[val] = val;//不能合并,独立
}
}
vector<vector<int>> getIntervals() {
vector<vector<int>> ans(m.size());
int i = 0;
for(auto& mi : m)
{
ans[i++] = {mi.first, mi.second};
}
return ans;
}
};
56 ms 29.1 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!