题目链接
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目解析
我们首先将nums数组排序(以nums中的每个数组的第一个值来进行排序),然后遍历该数组。
创建一个ret数组,若此时ret还为空,遍历到的左右边界直接插入即可,若ret不为空,但是此时ret数组的右边界小于此时遍历到的左边界,可知此时遍历的区间必定不会重叠,直接插入即可。若重叠,取此时ret数组的右边界与此时遍历的右边界的最大值即可。
代码
class Solution
{
public:
vector<vector<int>> merge(vector<vector<int>>& nums)
{
if(nums.empty()) return {};
vector<vector<int>> ret;
// 排序(以nums中的每个数组的第一个值来进行排序)
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++)
{
// 记录左右边界
int L=nums[i][0],R=nums[i][1];
// 当ret为空或者ret最后一个右边界在当前所遍历到的左边界的左边
// 说明此次遍历的左右边界肯定不会重叠 因此直接插入即可
if(ret.empty()||ret.back()[1]<L)
{
ret.push_back({L,R});
}
// 走到这里说明有重叠的情况
// 取当前右边界与ret中的右边界的最大值覆盖原来的右边界
else
{
ret.back()[1]=max(ret.back()[1],R);
}
}
return ret;
}
};