LeetCode56-合并区间
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
一、思路
(1)所有的区间进行排序,按照区间起点,由小到大进行排序。
(2)考虑:排序之后,两个区间合并的条件: 区 间 1. e n d > = 区 间 2. s t a r t 区间1.end>=区间2.start 区间1.end>=区间2.start
(3)合并后的新区间的起点显然是:区间1.start
(4)合并后的新区间的终点应该是: m a x ( 区 间 1. e n d , 区 间 2. e n d ) max(区间1.end,区间2.end) max(区间1.end,区间2.end)
(5)如此迭代,直到下个区间不满足合并条件为止。
(6)遍历所有向量中所有区间
C++代码:
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
vector<Interval> ans;
if (intervals.empty() || intervals.size() == 1)
return intervals;
q_sort(intervals, 0, intervals.size() - 1);
for (int i = 0; i < intervals.size(); i++) {
int k = i;
int max_end = intervals[i].end;
if (i + 1 < intervals.size() && intervals[i + 1].start <= max_end) {
while (i + 1 < intervals.size() && intervals[i + 1].start <= max_end) {
max_end = (max_end > intervals[i + 1].end) ? max_end : intervals[i + 1].end;
i++;
}
Interval temp;
temp.start = intervals[k].start;
temp.end = max_end;
ans.push_back(temp);
}
else
ans.push_back(intervals[i]);
}
return ans;
}
void q_sort(vector<Interval>& intervals, int begin, int end) {
if (begin >= end)
return;
int q = partition(intervals, begin, end);
q_sort(intervals, begin, q - 1);
q_sort(intervals, q + 1, end);
}
int partition(vector<Interval>& intervals, int begin, int end) {
int i, j;
i = begin - 1;
Interval x = intervals[end];
Interval temp;
for (j = begin; j < end; j++) {
if (intervals[j].start < x.start) {
i = i + 1;
temp = intervals[i];
intervals[i] = intervals[j];
intervals[j] = temp;
}
}
temp = intervals[i + 1];
intervals[i + 1] = x;
intervals[end] = temp;
return i + 1;
}
};
执行效率: