给定一组不重叠的间隔,在间隔中插入一个新的间隔(如有必要,合并)。间隔最初按照起始时间进行排序。

来源:互联网 发布:淘宝手机联盟怎么提现 编辑:程序博客网 时间:2024/05/17 01:29

本题源自LeetCode

---------------------------------------------------

思路 遍历间隔,

 1 如果间隔小余要插入的间隔 则直接压入

 2 如果有重叠则要合并,合并后的间隔,起始为最小的,结尾为最大的。

3 如果遇到比要出入大的,就终止循环,然后把后面比插入大的间隔压入。

vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {        vector<Interval> result;        int i=0;        int flag=0;        for(;i<intervals.size();i++){            if(intervals[i].end<newInterval.start)                result.push_back(intervals[i]);            else if(intervals[i].start>newInterval.end){                break;            }            else{                newInterval.start=min(newInterval.start,intervals[i].start);                newInterval.end=max(newInterval.end,intervals[i].end);            }        }        result.push_back(newInterval);        for(;i<intervals.size();i++)            result.push_back(intervals[i]);               return result;    }

延伸: 给定一个间隔数组,合并重复的。

思路 :先按开始时间排序,然后再将最小的压入结果数据结构,比较如果有重叠 就更新,否则 压入

 vector<Interval> merge(vector<Interval> &intervals) {        if(intervals.size()==0)            return vector<Interval>();        sort(intervals.begin(),intervals.end(),comp);        vector<Interval> result;        result.push_back(intervals[0]);        for(int i=1;i<intervals.size();i++){            if(result.back().end >= intervals[i].start){                Interval tmp=result.back();                result.pop_back();                tmp.end=max(tmp.end,intervals[i].end);              //  result.back().end=max(result.back().end,intervals[i].end);               result.push_back(tmp);            }else{                result.push_back(intervals[i]);            }        }        return result;    }        static bool comp(Interval a,Interval b){        return a.start<b.start;    }