【排序】【一次遍历】【数组】
56. 合并区间
题目意思非常明确,合并有重叠的区间。
数据量为 1 0 4 10^4 104,基本上需要时间复杂度为 O ( n ) O(n) O(n) 或者 O ( n l o g n ) O(nlogn) O(nlogn)的解题方法。
对数组 intervals
按照区间的起始值为关键进行升序排序。遍历该数组:
ret
为空直接将当前区间放入数组 ret
;ret
数组的最后一个区间没有交集,说明当前区间没法合并,直接加入答案数组;ret
最后一个区间进行合并,即取 max(ret.back()[1], intervals[1])
作为新的 ret.back()[1]
。思路清晰,最后返回ret
。
实现代码
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), [&](vector<int>& a, vector<int>& b) {
return a[0] < b[0];
});
vector<vector<int>> ret;
int n = intervals.size();
if (n == 1) {
return intervals;
}
for (int i = 0; i < n; ++i) {
int L = intervals[i][0], R = intervals[i][1];
if (!ret.size() || ret.back()[1] < L) {
ret.push_back({L, R});
}
else {
ret.back()[1] = max(ret.back()[1], R);
}
}
return ret;
}
};
复杂度分析
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn),一次遍历时间复杂度为 O ( n ) O(n) O(n),快速排序的时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),因此总的时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)。
空间复杂度: O ( l o g n ) O(logn) O(logn),这是排序需要的空间。空间复杂度计算不包括储存答案的数组。
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals.sort(key = lambda x : x[0])
res = []
for interval in intervals:
if not res or res[-1][1] < interval[0]:
res.append(interval)
else:
res[-1][1] = max(res[-1][1], interval[1])
return res
如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 。
如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。
最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 哦。