以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
思路:先以相邻区间为例,后续区间不交叉状态,可以整体在前(insert添加),可以整体再后(push_back添加),存在交叉区间判断元素大小
!!!这个方法可行,但是很笨,需要很多判断步骤,给自己绕进去了!!!
~~~强烈建议,引入algorithm库中sort函数,对传入数组先进性排序,保证vector中每组第一个元素的顺序是升序的,然后再采用相邻比较,大大简化判断操作~~~
1.intervals[i][0] > res[res_counter-1][1]
2.intervals[i][1] > res[res_counter-1][1]
只有这两个存在res结果数组的变化,其他不变
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> res;
int res_counter = 0;
sort(intervals.begin(), intervals.end());
for (int i = 0; i < intervals.size(); i++){
if (i == 0){
res.push_back(intervals[i]);
res_counter++;
}
else{
if (intervals[i][0] > res[res_counter-1][1]){
res.push_back(intervals[i]);
res_counter++;
}
else if (intervals[i][1] > res[res_counter-1][1]){
res[res_counter-1][1] = intervals[i][1];
}
}
}
return res;
}
};
int main(){
vector<vector<int>> intervals = {{2,3},{4,5},{6,7},{8,9},{1,10}};
Solution s;
vector<vector<int>> res = s.merge(intervals);
for (int i = 0; i < res.size(); i++)
cout << res[i][0] << " " << res[i][1] << endl;
return 0;
}