2021年03月16日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】
1. 问题简介
2. 题解
排序+双指针:先按照左区间的大小进行排序,然后利用双指针,循环的进行区间合并。
class Solution {
public:
struct cmp{
bool operator()(const vector<int>& v1,const vector<int>& v2){
return v1[0] < v2[0];
}
};
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end(),cmp());
vector<vector<int>> res;
// 利用双指针,循环的进行区间合并
for(int i=0;i<intervals.size();){
int t = intervals[i][1];
int j = i+1;
while(j<intervals.size() && intervals[j][0]<=t){
t = max(t,intervals[j][1]);
++j;
}
res.push_back({
intervals[i][0],t});
i = j;
}
return res;
}
};
由于sort()
函数是比较vector
里面的元素,而在本题中,元素又是vector
,vector
是通过字典序来比较大小的,所以本题可以不用写自定义比较规则,默认就是按照第一个元素的大小进行排序。
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end());
vector<vector<int>> res;
// 利用双指针,循环的进行区间合并
for(int i=0;i<intervals.size();){
int t = intervals[i][1];
int j = i+1;
while(j<intervals.size() && intervals[j][0]<=t){
t = max(t,intervals[j][1]);
++j;
}
res.push_back({
intervals[i][0],t});
i = j;
}
return res;
}
};
参考文献
https://leetcode-cn.com/problems/merge-intervals/solution/merge-intervals-by-ikaruga/