原题链接
力扣https://leetcode.cn/problems/merge-intervals/description/
题目要求将有重叠的区间合并,我们可以创建一个新的二维vector容器,存放答案。
做题过程中用到的一些基础知识:const auto&a:range,(只读)arr.push_back(),(在arr末尾放入)arr.back(),(获取arr末尾值)。
关键是创建新容器,比较新容器当前数组右端点与给定容器数组左端点的值。
题目给定的是无序容器,要先排序。注意:二维vector的sort排序是先按照第一个值升序排列,第一个值相等则按照第二个值降序排列。
具体代码及注释:
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if(intervals.size()==0) {return {};}//先判断给定的长度值是否为0
sort(intervals.begin(),intervals.end());//排序.二维vector按照第一个元素进行升序排序,如果第一个元素相等,则按照第二个元素进行降序排序。
vector<vector<int>>merged; //新定义一个二维动态容器merged
for(int i=0;i<intervals.size();i++)//对输入的区间开始进行查询
{
int L=intervals[i][0],R=intervals[i][1];//令L为区间当前区间左端点的值,R为右端点的值
if(!merged.size()||merged.back()[1]<L)//当检索区间的长度为0或者上一个区间的右端点值小于该区间的左端点值(就是说两个区间没有交区间)
{
merged.push_back({L,R});//在merged内的尾部直接加上当前区间{L,R}的值
}
else //当和上一个区间有交区间并且当前区间长度不为0的时候
{
merged.back()[1]=max(merged.back()[1],R);//上一个区间的右端点值应等于两个区间右端点值比较出的较大值,方便两个区间的合并
}
}
return merged;
}
};
简化版本: