力扣56. 合并区间
题目来源(力扣):
https://leetcode.cn/problems/merge-intervals/description/
题目描述:
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。
请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
基本思路:
与力扣452. 用最少数量的箭引爆气球 https://www.cnblogs.com/hb-computer/articles/18553974 非常类似
将所有区间按照左端点排序,然后遍历所有区间进行合并。
当区间i的左端点在当前的[l,r]中,则对r进行更新,r=max(r,intervals[i]);
当区间i不在当前的[l,r]中时,说明形成了一个新的区间,将旧区间加入到ans中,并且更新[l,r];
具体见代码,如下:
代码实现:
class Solution
{
public:
static bool cmp(vector<int> &a, vector<int> &b)
{//按照左区间从小到大排序
return a[0] < b[0];
}
vector<vector<int>> merge(vector<vector<int>> &intervals)
{
int len = intervals.size();
sort(intervals.begin(), intervals.end(), cmp);
vector<vector<int>> ans;
vector<int> tmp(2, 0); // tmp初始化为2个0
int l = intervals[0][0], r = intervals[0][1];
for (int i = 1; i < len; i++)
{
if (intervals[i][0] > r)
{ // 说明形成了新区间
tmp[0] = l, tmp[1] = r; // 将上一个区间加入到ans中
ans.push_back(tmp);
// 新区间[l,r]
l = intervals[i][0];
r = intervals[i][1];
}
else
{
r = max(r, intervals[i][1]);
}
}
tmp[0] = l, tmp[1] = r; // 将最后一个区间[l,r]加入到ans中
ans.push_back(tmp);
return ans;
}
};
时间复杂度
O(nlogn)
时间主要花费在排序上面,排序时间复杂度O(nlogn)
而遍历所有区间的复杂度为O(n)
总时间复杂度为O(nlogn+n),即O(nlogn)
浙公网安备 33010602011771号