首页 > 编程语言 >LeetCode_Array_56. Merge Intervals (C++)

LeetCode_Array_56. Merge Intervals (C++)

时间:2022-10-27 16:05:55浏览次数:40  
标签:index right res 56 C++ Merge intervals ans left


目录

​1,题目描述​

​2,解题思路​

​3,代码【C++】​

​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,运行比较

我的代码

LeetCode_Array_56. Merge Intervals (C++)_LeetCode

大神的代码

LeetCode_Array_56. Merge Intervals (C++)_Array_02

 

标签:index,right,res,56,C++,Merge,intervals,ans,left
From: https://blog.51cto.com/u_15849465/5801375

相关文章