给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
解题
贪心算法
将给定数组按第一个数排序,
关键点
创建一个新数组,与给定数组比较,若区间左端在区间内,取右端大的。
熟悉vector的用法,!vector.size()可以判断vector是否为空;vector.back()可得到vector最后的元素;
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if (intervals.size()==0){
return {};
}
sort(intervals.begin(), intervals.end());
//按first排序
//新建一个二维数组,保存结果
vector<vector<int>> result;
for(int i=0;i<intervals.size();i++)
{
int L=intervals[i][0], R = intervals[i][1];
if(!result.size()||result.back()[1]<intervals[i][0])
result.push_back(intervals[i]);
else result.back()[1]=max(intervals[i][1],result.back()[1]);
}
return result;
}
};
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 1:
输入: intervals = [[1,3],[6,9]], newInterval = [2,5]
输出: [[1,5],[6,9]]
示例 2:
输入: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出: [[1,2],[3,10],[12,16]]
解释: 这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
解题:复杂度NlogN
把newinterval先放入interval中,然后按第一个数排序;
后面与合并区间相同做法即可;
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
vector<vector<int>> result;
intervals.push_back(newInterval);
sort(intervals.begin(),intervals.end());
for(int i=0;i<intervals.size();i++)
{
if(!result.size()||intervals[i][0]>result.back()[1])
result.push_back(intervals[i]);
else result.back()[1]=max(result.back()[1],intervals[i][1]);
}
return result;
}
};
解题2:复杂度N
因为给定数组已排序,则左值小于newinterval的先放入结果vector中;
当左值不小于newinterval时,合并newinterval到结果数组中;
再合并后续区间即可;
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
vector<vector<int>> result;
int i;
for(i=0;i<intervals.size();i++)
{
if(intervals[i][0]<newInterval[0])
result.push_back(intervals[i]);
else break;
}
if(!result.size()||newInterval[0]>result.back()[1])
result.push_back(newInterval);
else result.back()[1]=max(result.back()[1],newInterval[1]);
for(;i<intervals.size();i++)
{
if(!result.size()||intervals[i][0]>result.back()[1])
result.push_back(intervals[i]);
else result.back()[1]=max(result.back()[1],intervals[i][1]);
}
return result;
}
};
题目链接:57. 插入区间