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;
}
};