1. 程式人生 > >LeetCode-56. Merge Intervals

LeetCode-56. Merge Intervals

leet 一個 == etc art UC merge pan emp

一、問題描述

給定一系列區間,要求將其中重疊的、臨接的區間合並成一個區間

例子:

給定[1,3],[2,6],[8,10],[15,18]

輸出[1,6],[8,10],[15,18]

二、問題解決

第一步:先對區間按區間頭進行排序

第二步:從第一個區間開始遍歷,如果後一個區間與前一個區間有重疊或是緊挨著,則合並,並且繼續往後讀。如果沒有,則將該區間加入result中,並且以下一個區間為起始區間重復這一步。

//表示區間的結構
struct Interval {
    int start;
    int end;
    Interval() : start(0), end(0) {}
    Interval(
int s, int e) : start(s), end(e) {} }; //排序函數 void mysort(vector<Interval>& intervals) { for (int i = 0; i < intervals.size(); i++) { int pos = i; while (pos < intervals.size()) { if (intervals[pos].start < intervals[i].start) swap(intervals[pos], intervals[i]); pos
++; } } } vector<Interval> merge(vector<Interval>& intervals) { vector<Interval> result; if (intervals.size() == 0) return result; mysort(intervals); int pos = 0; while (pos < intervals.size()) { Interval temp(intervals[pos].start,intervals[pos].end);
while (++pos < intervals.size() && intervals[pos].start <= temp.end) temp.end = max(intervals[pos].end,temp.end); result.emplace_back(temp); } return result; } //這是測試用例 int main() { vector<Interval> v = {Interval(1,4),Interval(0,4)}; auto result = merge(v); for (auto i : result) { cout << i.start; cout << i.end; cout << endl; } system("pause"); return 0; }

LeetCode-56. Merge Intervals