56. Merge Intervals(合并区间)
class Solution {
public:
//定义排序函数
static bool cmp(vector<int> &a,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>>& ints) {
vector<vector<int> > res;
if(ints.empty()){
return res;
}
//对区间进行排序
sort(ints.begin(),ints.end(),cmp);
int i=0;
while(i<(int)ints.size()){
if(res.empty()){
//数组为空的时候
res.push_back(ints[i]);
}else{
vector<int> back=res.back();
if(back[1]<ints[i][0]){
res.push_back(ints[i]);
}else{
//[1,3],[2,6],[8,10],[15,18]
//3>=2,所以和res的最后一个元素进行合并操作
res[res.size()-1][0]=min(back[0],ints[i][0]);
res[res.size()-1][1]=max(back[1],ints[i][1]);
}
}
i++;
}
return res;
}
};
57.Insert Interval(插入区间)
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
输入: intervals = [[1,3],[6,9]], newInterval = [2,5]
输出: [[1,5],[6,9]]
输入: 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] 重叠。
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& ints, vector<int>& news) {
vector<vector<int> > res;
if(ints.empty()){
res.push_back(news);
return res;
}
int n=ints.size(),cur=0;
//这里比较容易理解
//[1,3][6,9],然后如果插入[7,8]因为7大于3,所以直接将[1,3]放入结果中。
while(cur<n && ints[cur][1]<news[0]){
res.push_back(ints[cur++]);
}
//如果是[1,2]、[5,7]、[8,9]要插入[3,10],那么首先10和7比较,然后要插入的数据编程了[3,10]
//然后和[8,9]比较,要插入的数据还是[3,10],这个时候cur==n了然后将news加入到结果中就可以了。
//在执行这个的过程中,news[0]存储的是最小值,然后news[1]存储的是最大值。
while(cur<n && ints[cur][0]<=news[1]){
//这个过程相当于用news[0]存储最小值,news[1]去找到最大值。
news[0] = min(news[0], ints[cur][0]);
news[1] = max(news[1], ints[cur][1]);
++cur;
}
res.push_back(news);
while(cur<n){
res.push_back(ints[cur++]);
}
return res;
}
};