给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 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] 重叠。
说是困难难度的题,其实考察的知识点就两个:区间合并 + 贪心。
AC代码:
class Solution {
public:
vector<vector<int> > insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
#define INF -2e9 //定义一个最小值
vector<vector<int> > res;
typedef pair<int,int> PII;
vector<PII> ans , a;
for(auto it : intervals) a.push_back({it[0],it[1]});//用pair来存取每个区间,first存左端点,second存右端点。保证插入新数组后可以对其按区间起始端点排序。
a.push_back({newInterval[0],newInterval[1]}); //插入新区间
sort(a.begin() , a.end()); //按区间左端点值由小到大排序
int st = INF , ed = INF; //当前维护区间的左右端点
for(vector<PII>::iterator it = a.begin() ; it != a.end() ; it ++){
if(ed < it->first){
if(st != INF) ans.push_back({st , ed}); //如果不是初始区间,则加进去
st = it->first;
ed = it->second;
}
else if(ed >= it->first){
if(st != INF) ed = max(ed , it->second);
}
}
if(st != INF) ans.push_back({st , ed}); //判断是防止输入是空的情况,把最后一个区间也加进去
for(vector<PII>::iterator it = ans.begin() ; it != ans.end() ; it ++)
res.push_back({it->first,it->second});
return res;
}
};
用auto迭代简化代码后:
class Solution {
public:
vector<vector<int> > insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
#define INF -2e9 //定义一个最小值
vector<vector<int> > res;
typedef pair<int,int> PII;
vector<PII> ans , a;
for(auto it : intervals) a.push_back({it[0],it[1]});//用pair来存取每个区间,first存左端点,second存右端点。保证插入新数组后可以对其按区间起始端点排序。
a.push_back({newInterval[0],newInterval[1]}); //插入新区间
sort(a.begin() , a.end()); //按区间左端点值由小到大排序
int st = INF , ed = INF; //当前维护区间的左右端点
for(auto it : a){
if(ed < it.first){
if(st != INF) ans.push_back({st , ed}); //如果不是初始区间,则加进去
st = it.first;
ed = it.second;
}
else if(ed >= it.first){
if(st != INF) ed = max(ed , it.second);
}
}
if(st != INF) ans.push_back({st , ed}); //判断是防止输入是空的情况,把最后一个区间也加进去
for(auto it : ans)
res.push_back({it.first,it.second});
return res;
}
};