目录
1,题目描述
2,解题思路
4,运行比较
1,题目描述
Given a collection of intervals, merge all overlapping intervals.
Example 1:
Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
Example 2:
Input: [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.
NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-intervals
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2,解题思路
我的思路
- 先排序
- 设置left,right,将排序后的一系列连续区间合并后(大致分为四种情况:[1,3]与[1,2]、[1,3]与[2,3]、[1,3]与[2,4]、[1,3]与[4,5]),更新left与right;
- 若出现断层,将{left,right}加入ans数组中,并更新left与right(若最后一组出现断层,则需单独判断);
大神的思路
- 先排序;
- 设置index,并将intervals首个区间加入ans中;
- 判断时先判断是否连通,再细分不同情况;
- 更新时,只需更新当前index的第二个元素即可;
3,代码【C++】
我的代码
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> ans;
if(intervals.empty() == true) return ans;//input 为空
sort(intervals.begin(), intervals.end());//默认递增排序
int left = intervals[0][0];
int right = intervals[0][1];
for(int i = 0 ; i < intervals.size() ; i++){
if(left == intervals[i][0]){
if(right < intervals[i][1]) {right = intervals[i][1];}//[1,3],[1,4]
}
else{
if(right < intervals[i][0]) {
ans.push_back({left,right});
left = intervals[i][0];
right = intervals[i][1];
}//[1,3],[4,5]
else if(right < intervals[i][1]) {right = intervals[i][1];}//[1,3],[2,4]
}
if(i == intervals.size() - 1) ans.push_back({left, right});
}
return ans;
}
};
大神的代码
class Solution {
public:
//排序
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> res; //声明res
if(intervals.empty()) return res; //判断边界
sort(intervals.begin(),intervals.end()); //将区间的左边界进行排序
int index = 0; //res的遍历索引
res.push_back(intervals[0]); //先将intervals的第一个区间放到res里面
for (int i = 1; i < intervals.size(); i++) //遍历intervals的其他区间
{
if(res[index][1] >= intervals[i][0]) //res从index开始,由于intervals已经排序,如果满足res[index]的右区间 大于
{ //intervals[i]的左区间,表明这两个区间有交集
if(res[index][1] < intervals[i][1]) //除此之外,还要判断res[index]的右区间 与 intervals[i]的右区间的关系,
{ //如果res[index]的右区间 小于 intervals[i]的右区间,则取代,反之不变。
res[index][1] = intervals[i][1]; //例如 [[1,4] ,[2,3]] -> [[1,4]]
}
}
else
{
index++; //如果不满足有联通区域,直接将index++,并将当前的intervals[i] 放到res里面,进行下一时刻的合并
res.push_back(intervals[i]);
}
}
return res;
}
};
4,运行比较
我的代码
大神的代码
标签:index,right,res,56,C++,Merge,intervals,ans,left From: https://blog.51cto.com/u_15849465/5801375