LeetCode Insert Interval

来源:互联网 发布:简单的平面设计软件 编辑:程序博客网 时间:2024/06/06 03:22

题目

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].

 

将区间插入已经排序好的区间。

从头开始向后扫描:

1、如果不重叠,且排序好的区间小于要插入的区间,将原区间插入结果;

2、如果重叠,合并,作为新的要插入的区间;

3、如果不重叠,且排序好的区间大于要插入的区间,在结果中插入要插入的区间,后面所有的区间;

 

二分查找的思路:

如果数据量较大,原数据可以较快地修改,删除,插入。

可以使用二分查找,分别找出要插入的头在原区间头的位置,要插入的尾在原区间尾的位置。

比较前后两个位置各自前后的两个区间,可以确定合并情况。

然后将要合并的区间合并即可得到结果。

 

代码:线性查找

/** * Definition for an interval. * struct Interval { *     int start; *     int end; *     Interval() : start(0), end(0) {} *     Interval(int s, int e) : start(s), end(e) {} * }; */class Solution {public:    vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {        vector<Interval> ans;int len=intervals.size(),i;for(i=0;i<len;i++)//扫描{if(newInterval.start>intervals[i].end)//不重叠,且大于目前区间,压入目前区间ans.push_back(intervals[i]);else if(newInterval.end>=intervals[i].start)//重叠,合并{newInterval.start=min(newInterval.start,intervals[i].start);newInterval.end=max(newInterval.end,intervals[i].end);}else//不重叠,小于当前区间,压入插入区间和后面的区间{ans.push_back(newInterval);while(i<len){ans.push_back(intervals[i]);i++;}}}if(i==len)//没有压入新区间则压入ans.push_back(newInterval);return ans;    }};


 

 

 

 

 

0 0
原创粉丝点击