1. 区间合并
先将区间进行排序,排序完后那么,区间合并就为以下三种情况
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end());
int st,ed;
vector<vector<int> > result;
for (int i=0;i<intervals.size();i++){
if (i==0){
st = intervals[i][0];
ed = intervals[i][1];
}
if (intervals[i][0]<=ed)ed = max(intervals[i][1],ed);
if (intervals[i][0]>ed){
result.push_back({st,ed});
st = intervals[i][0];
ed = intervals[i][1];
}
}
result.push_back({st,ed});
return result;
}
};
2. 无重叠区间
假设按照左边界进行排序,那么从第二个元素开始遍历,如果它的左边界在前一个元素的右边界之内那么就是发生了重叠,此时需要考虑是移除前一个元素还是移除当前元素,可以轻松得出谁的右边界更长那么更有可能与后面的元素发生重叠,也就需要被移除
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if (intervals.size() == 0) return 0;
sort(intervals.begin(),intervals.end());
for (int i=0;i<intervals.size();i++){
cout<<intervals[i][0]<<","<<intervals[i][1]<<endl;
}
int st,ed;
int result = 0;
st = intervals[0][0];
ed = intervals[0][1];
for (int i=1;i<intervals.size();i++){
if (intervals[i][0]<ed){
result++;
ed = min(intervals[i][1],ed);
}else {
ed = intervals[i][1];
}
}
return result;
}
};