文章目录
- 1. 题目
- 2. 解题
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 >= valif(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++
题解区还有比较暴力的做法,直接全部插入set,最后顺序整理区间
class SummaryRanges {
public:/** Initialize your data structure here. */set<int> ans;SummaryRanges() {}void addNum(int val) {ans.insert(val);}vector<vector<int>> getIntervals() {vector<vector<int>> res;int left = *ans.begin();int right = *ans.begin();for (auto it = ans.begin(); it != ans.end(); it++) {if (*it > right + 1) {res.push_back({left, right});left = *it;}right = *it;}res.push_back({left, right});return res;}
};作者:qia-si-ming-yue-qing-feng
链接:https://leetcode-cn.com/problems/data-stream-as-disjoint-intervals/solution/bao-li-mei-xue-setyong-fa-by-qia-si-ming-yue-qing-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
其时间 96 ms 31.7 MB C++,我的解法稍优一些
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!