合并区间
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
解法1:
- 首先题目并没有说明数组是排序的,所以我们第一步进行排序,根据数组第一位升序排序,一旦第一位相等则按第二位降序排序。
- 第二,由于在原数组进行更改的话需要花费太多时间在删除元素和更改元素上,所以我们声明一个二维数组存放结果,一个一维数组暂时存放要插入的数据。
- 由于是排序过的,所以我们在判断的时候先判断区间下边界是否大于等于下个区间的上边界,若是则可以判断出此时两区间存在重复,反之两区间不重复;继续判断区间的下边界是否小于下个区间的下边界,若是则说明两区间存在交叉,反之说明是区间包含。
class Solution {
public:
static bool cmp(const vector<int>&a,const vector<int>&b )
{
if(a[0]==b[0])
return a[1]>b[1];
return a[0]<b[0];
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if(intervals.empty()) return intervals;
vector<vector<int>> res;
int count=0;
sort(intervals.begin(),intervals.end(),cmp);
vector<int> temp;
temp.push_back(intervals[0][0]);
temp.push_back(intervals[0][1]);
res.push_back(temp);
for(int i=1;i<intervals.size();i++)
{
if(res[count][1]>=intervals[i][0])
{
if(res[count][1]<=intervals[i][1])
{
res[count][1]=intervals[i][1];
}
}
else
{
count++;
temp[0]=intervals[i][0];
temp[1]=intervals[i][1];
res.push_back(temp);
}
}
return res;
}
};