以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
引言---之前写这道题的思路第一思路是想到用栈来保存一个区间,然后和后续的区间进行对比分情况讨论,但是之前一直没有AC,现在终于完成了,于是记录在这里了。
解题思路
要解决这个问题,我们可以按照以下步骤进行:
-
排序:首先将所有区间按照起始时间进行排序。这样我们可以确保在遍历时,相邻的区间是有序的,便于合并。
-
合并:使用一个栈来辅助合并区间。遍历排序后的区间列表,如果当前区间与栈顶的区间有重叠,则合并它们;否则,将当前区间压入栈中。
-
输出结果:最后,栈中剩余的区间就是合并后的结果。
class Solution { public: vector<vector<int>> merge(vector<vector<int>>& intervals) { vector<vector<int>> ret; stack<int> st; // 对区间按起始时间排序 sort(intervals.begin(), intervals.end()); for (auto e : intervals) { if (st.empty()) { st.push(e[0]); st.push(e[1]); } else if (e[0] <= st.top()) { int tem = st.top(); st.pop(); st.push(max(e[1], tem)); } else { int x = st.top(); st.pop(); int y = st.top(); st.pop(); ret.push_back({y, x}); st.push(e[0]); st.push(e[1]); } } //最后剩下的区间 int x = st.top(); st.pop(); int y = st.top(); st.pop(); ret.push_back({y, x}); return ret; } };
代码解析
-
排序:我们使用
sort
函数对区间进行排序,确保所有区间按起始时间升序排列。 -
栈的使用:我们使用一个栈来存储当前合并后的区间。栈中存储的是区间的起始和结束时间。
-
合并逻辑:
-
如果栈为空,直接将当前区间的起始和结束时间压入栈中。
-
如果当前区间的起始时间小于等于栈顶的结束时间,说明有重叠,我们更新栈顶的结束时间为当前区间和栈顶区间的最大结束时间。因为我们前面排序仅仅排序了开始时间我们并不知道哪个区间的结束时间更晚!!!!
-
如果没有重叠,我们将栈中的区间弹出并存入结果集,然后将当前区间压入栈中。
-
-
处理剩余区间:最后,栈中还有剩余的区间,将其弹出并存入结果集。
-
复杂度分析
-
时间复杂度:排序的时间复杂度为O(n log n),遍历区间的时间复杂度为O(n),因此总的时间复杂度为O(n log n)。
-
空间复杂度:我们使用了一个栈来存储区间,最坏情况下栈的大小为O(n),因此空间复杂度为O(n)。
总结
通过排序和栈的结合使用,我们可以高效地解决合并区间的问题。这个方法不仅思路清晰,而且代码实现也相对简洁。希望本文能帮助你更好地理解这个问题及其解决方案。如果你有任何问题或建议,欢迎在评论区留言讨论。