# 56. Merge Intervals
###### tags: `C++` `LeetCode` `Medium`
## Note
```
在寫給 sort 使用的函數 comp 的時候,如果是兩個相同的物件,必須回傳 false
原因不明,是 stl 的某種隱晦規定
= example 1 =
step 1 :
currentInterval = 0
mergeLeft = 1
mergeRight = 3
index 0 1 2 3
{1,3}, {2,6}, {8,10}, {15,18}
step 2 :
currentInterval = 1
2 < 3 -> interval 0 和 interval 1 相交成為新的 interval
mergeLeft = 1
mergeRight = 6
index 0 1 2 3
{1,3}, {2,6}, {8,10}, {15,18}
------------
step 3 :
currentInterval = 2
8 > 6 -> interval 0 + 1 和 interval 2 沒有相交
mergeLeft = 8
mergeRight = 10
result = {1, 6}
index 0 1 2 3
{1,3}, {2,6}, {8,10}, {15,18}
------------ ------
step 4 :
currentInterval = 3
15 > 10 -> interval 2 和 interval 3 沒有相交
mergeLeft = 15
mergeRight = 18
result = {1, 6} {8, 10}
index 0 1 2 3
{1,3}, {2,6}, {8,10}, {15,18}
------------ ------
step 5 :
已經 traverse 所有 interval
把目前手上正在處理的 interval 推進 result
result = {1, 6} {8, 10} {15, 18}
index 0 1 2 3
{1,3}, {2,6}, {8,10}, {15,18}
------------ ------ -------
```
## Code
```c++
#include <algorithm>
#include "cout.h"
vector<vector<int>> merge(vector<vector<int>>& intervals);
static bool comp(const vector<int>& vec1, const vector<int>& vec2);
int main()
{
vector<vector<int>> intervals = {{1, 3}, {2, 6}, {8, 10}, {15,18}};
coutVectorVector(merge(intervals));
return 0;
}
vector<vector<int>> merge(vector<vector<int>>& intervals)
{
vector<vector<int>> result;
vector<int> v = {0, 0};
int len = intervals.size();
int mergeLeft = 0;
int mergeRight = 0;
int left = 0;
int right = 0;
int lastLeft = 0;
sort(intervals.begin(), intervals.end(), comp);
mergeLeft = intervals[0][0];
mergeRight = intervals[0][1];
for(int current = 1; current < len; current++)
{
left = intervals[current][0];
right = intervals[current][1];
if(left == lastLeft) continue;
if(left <= mergeRight)
{
mergeRight = (mergeRight > right) ? mergeRight : right;
}
else
{
v[0] = mergeLeft;
v[1] = mergeRight;
result.push_back(v);
mergeLeft = intervals[current][0];
mergeRight = intervals[current][1];
}
}
v[0] = mergeLeft;
v[1] = mergeRight;
result.push_back(v);
return result;
}
static bool comp(const vector<int>& vec1, const vector<int>& vec2)
{
if(vec1[0] != vec2[0]) return vec1[0] < vec2[0];
if(vec1[0] == vec2[0])
{
if(vec1[1] != vec2[1]) return vec2[1] < vec1[1];
}
return false;
}
```