LeetCode 56
Merge Intervals
- Problem Description:
合并所有的重叠区间。
具体的题目信息:
https://leetcode.com/problems/merge-intervals/description/ - Example:
- Solution:
- 解题思路:题目实际考查重叠区间的求法,我们定义一个比较函数将所有的区间按照左区间大小从小到大排序,比较相邻区间是否有重叠(前者的右区间不小于后者的左区间),如果有重叠,注意更新合并后区间的右区间。
- 编程实现:
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
static bool compare(Interval p, Interval q) {
return (p.start<q.start)||(p.start==q.start&&p.end<q.end);
}
vector<Interval> merge(vector<Interval>& intervals) {
if (intervals.size() == 0||intervals.size() == 1) return intervals;
vector<Interval> res;
sort(intervals.begin(), intervals.end(), compare);
int flag = 0, s = 0, e = 0, rear = 0;
Interval t;
for (int i = 0; i < intervals.size(); i++) {
if (flag == 0) {
if (i < intervals.size()-1) {
if (intervals[i].end>=intervals[i+1].start) {
flag = 1;
s = i;
rear = max(intervals[i].end, intervals[i+1].end);
if (i+1 == intervals.size()-1) {
t = Interval(intervals[s].start, rear);
res.push_back(t);
break;
}
} else {
res.push_back(intervals[i]);
}
} else {
res.push_back(intervals[i]);
}
} else {
while(i < intervals.size()-1&&intervals[i+1].start<=rear) {
i++;
rear = max(rear, intervals[i].end);
}
t = Interval(intervals[s].start, rear);
res.push_back(t);
flag = 0;
if (i == intervals.size()-1) break;
}
}
return res;
}
};