# [56] 合并区间

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

输入: intervals = [[1,3],[2,6],[8,10],[15,18]]

输出: [[1,6],[8,10],[15,18]]

解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例  2:

输入: intervals = [[1,4],[4,5]]

输出: [[1,5]]

解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

提示:

intervals[i][0] <= intervals[i][1]

解区间的题型最重要的就是处理区间之间顺序关系,这能让我们思考逻辑时直接砍掉一半的逻辑节点,对于思考复杂树的难度是指数级下降的。

比如对于本题来说,我们只需要让区间的某一边有序(其实起始位置或结束位置有序都行,下面的解法对起始位置排序)。

这样一来我们对两个区间取并集时,起始位置就一定会取第一个区间的。之后只需要比较第二个区间的起始位置与第一个区间的结束位置,就能知道两个区间是否相交了。这样是新建一个区间还是扩展一个区间的选择就非常好做了。

所以解区间问题的关键点在于优先排序。

function merge(intervals: number[][]): number[][] {
  const res: number[][] = [];
  intervals.sort((a, b) => a[0] - b[0]);

  for (const interval of intervals) {
    const origin = res[res.length - 1];
    if (res.length <= 0 || origin[1] < interval[0]) {
      // 不存在交集时直接放入
      res.push(interval);
    } else {
      // 此时存在交集,确认是包含还是交集关系,取代原来的最后一个区间
      res[res.length - 1][1] = Math.max(origin[1], interval[1]);
    }
  }

  return res;
}