C++ 插入区间

    //给定一个无重叠的,按照区间起点升序排列的区间列表,在列表中插入一个新区间,如果有原区间有重合,则合并,请返回插入后的区间列表。
    //数据范围:区间列表长度满足0-10^4, 区间的左右端点满足0 <= l,r <= 10^5

    //该实现性能够了,但不够简洁
    vector<Interval> insertInterval(vector<Interval>& Intervals, Interval newInterval)
    {
        int start = newInterval.start;//记录新区间的开始点
        int end = newInterval.end;//记录新区间的结束点
        size_t length = Intervals.size();
        vector<Interval> result;
        size_t i = 0;//记录当前迭代到哪个区间点
        size_t p = 0;//记录新区间的插入点
        for (; i < length; i++)//把前面与新区间不重叠的区间直接放置至结果数组
        {
            if (Intervals[i].end < start)
            {
                result.push_back(std::move(Intervals[i]));
            }
            else
            {
                break;
            }
        }
        if (i < length)
        {
            if (start > Intervals[i].start)//找出最早开始点
            {
                start = Intervals[i].start;
                p = i;
            }
            for (; i < length; i++)//找出最后结束点和加入剩下重叠的区间
            {
                if (Intervals[i].start <= end)
                {
                    if (Intervals[i].end > end)
                        end = Intervals[i].end;
                }
                else
                {
                    result.push_back(std::move(Intervals[i]));
                }
            }
        }
        result.emplace(result.begin() + p, start, end);//插入新区间
        return std::move(result);
    }

 

posted @ 2021-12-31 08:25  mshentai  阅读(90)  评论(0编辑  收藏  举报