其他分享
首页 > 其他分享> > LeetCode 352. 将数据流变为多个不相交区间(map二分查找)

LeetCode 352. 将数据流变为多个不相交区间(map二分查找)

作者:互联网

文章目录

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. 解题

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阿明),一起加油、一起学习进步!
Michael阿明

标签:map,val,start,int,else,prevEnd,352,区间,LeetCode
来源: https://blog.csdn.net/qq_21201267/article/details/113062808