【LeetCode】Merge Intervals && Insert Interval

来源:互联网 发布:epson照片打印软件 编辑:程序博客网 时间:2024/05/29 08:54

参考链接

Insert Interval
http://blog.csdn.net/worldwindjp/article/details/21612731

http://blog.csdn.net/littlestream9527/article/details/17686435



http://www.cnblogs.com/remlostime/archive/2012/11/25/2787387.html


题目描述

Insert Interval

 

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

You may assume that the intervals were initially sorted according to their start times.

Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].


Merge Intervals

 

Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].




题目分析

Merge Intervals 
 首先按start 排序 ,
 设置一个start,end
 如果 end <  intervals[i].start 就可以把 (start,end),添加进去
 如果 end <  intervals[i].end 就把end更新为  intervals[i].end,也就是把 intervals[i]合并入(start,end)
 如果 end >= intervals[i].end 说明  intervals[i] 已经在  (start,end) 不用处理 

Insert Interval
方法一,把newInterval插入按start排序的位置。然后执行merge interval
方法二,找到start和end插入的位置。见代码注释



class Solution {public:    vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {        vector<Interval> ret;int size = intervals.size();        //TODO size 1                int i = 0;        int start = 0, end = 0;        for(i = 0;i<size;i++)        {        if(intervals[i].start> newInterval.end)//这里i后的都不用处理         break;}end = i;for(;i>=0;i--)        {        if(i<size && intervals[i].end < newInterval.start)//这里i之前的都不用处理         break;}start = i;for(i = 0;i<=start;i++)//start之前的肯定是和新插入的 没有交集的 {ret.push_back(intervals[i]);}if(start + 1 < size && newInterval.start > intervals[start+1].start)newInterval.start = intervals[start+1].start;if(end>0 && newInterval.end < intervals[end-1].end)newInterval.end = intervals[end-1].end;ret.push_back(newInterval);for(i = end;i<size;i++)//end之后的肯定是和新插入的 没有交集的 {ret.push_back(intervals[i]);}        return ret;    }};




 bool comp(const Interval &a, const Interval &b){      if(a.start==b.start)return a.end<b.end;    return a.start<b.start;}class Solution {public:    vector<Interval> merge(vector<Interval> &intervals) {        vector<Interval> ret;        int size = intervals.size();                sort(intervals.begin(),intervals.end(),comp);                if(size < 1) return ret;        int start = intervals[0].start;        int end = intervals[0].end;        for(int i = 1;i<size;i++)        {        if(end < intervals[i].start)        {        ret.push_back(Interval(start,end));        start = intervals[i].start;        end = intervals[i].end;}if(end < intervals[i].end)end = intervals[i].end;}ret.push_back(Interval(start,end));return ret;    }};



推荐学习C++的资料

C++标准函数库
http://download.csdn.net/detail/chinasnowwolf/7108919
在线C++API查询
http://www.cplusplus.com/
0 0
原创粉丝点击