返回
力争成为海贼王!用纯洁的C++向剑指LeetCode进军(56)—— 合并区间问题
前端
2024-01-29 07:17:15
大家好!我是路飞,今天我们一起来解决LeetCode的第56关:合并区间。让我们一起扬帆起航,探索LeetCode的广阔世界吧!
问题
给你一个由不相交区间组成的列表intervals,其中intervals[i] = [starti, endi]表示开始于starti并结束于endi的区间。合并所有重叠的区间,并返回一个不重叠的区间列表,该列表应按起始位置排序。
输入:
intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:
[[1,6],[8,10],[15,18]]
示例 2:
intervals = [[1,4],[4,5]]
输出:
[[1,5]]
示例 3:
intervals = [[1,4],[0,4]]
输出:
[[0,4]]
思路解析
解决这个问题,我们可以使用贪心算法。首先,我们将所有区间按照起始位置排序。然后,我们从第一个区间开始,将其与后续的区间进行比较。如果当前区间与后续区间重叠,那么我们就将两个区间合并。如果两个区间不重叠,那么我们就将当前区间添加到最终结果中,并继续比较下一个区间。
C++实现
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if (intervals.size() == 0) {
return {};
}
// 先按照起始位置排序
sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
});
vector<vector<int>> result;
result.push_back(intervals[0]);
for (int i = 1; i < intervals.size(); i++) {
if (result.back()[1] >= intervals[i][0]) {
// 重叠,更新结果中的最后一个区间
result.back()[1] = max(result.back()[1], intervals[i][1]);
} else {
// 不重叠,将当前区间添加到结果中
result.push_back(intervals[i]);
}
}
return result;
}
};
复杂度分析
- 时间复杂度:O(nlogn),其中n为区间数量。排序的时间复杂度为O(nlogn),而合并区间的过程的时间复杂度为O(n)。
- 空间复杂度:O(n),因为我们使用了一个结果向量来存储合并后的区间。
结语
以上就是合并区间问题的解决方法。希望这篇文章对大家有所帮助。
想要了解更多精彩内容,请持续关注我们!