56. Merge Intervals(合并区间)解法(C++ & 注释)

56. Merge Intervals(合并区间)

  • 1. 题目描述
  • 2. 排序(Sorting)
    • 2.1 解题思路
    • 2.2 实例代码

1. 题目描述

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

示例 1:

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间[1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

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

题目链接:中文题目;英文题目

2. 排序(Sorting)

2.1 解题思路

首先,这题需要明确一下输入的限制,否则会有很多歧义,题意也没有明说:

1 <= intervals[i].length <= 2,且intervals[i][0] <= intervals[i][1]

其实用sort排序之后,思路非常好理解的。我们以下面这个例子为例:

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

升序排序之后,我们确保相邻两个间距最近,如果它们不能合并,则第一个间距则不可能和后面的间距合并。比如上面这个例子,[1,3]右边界3大于[2,6]左边界2,它们可以合并,之后[2,6]的右边界6小于[8,10]左边界8,所以不能合并,因为是升序排序,所以[2,6]也不能和比[8,10]远的[15,18]合并。所以我们利用这点,总结出下面的合并规律:

前一个间隔右边界小于等于后一个间隔左边界,则可以合并;反之,则不能合并,将这个间隔加入答案中,移动到下一个间隔,继续合并后面的间隔;

2.2 实例代码

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> ans;
        if (!intervals.size()) return ans;
        sort(intervals.begin(), intervals.end());

        int start = intervals[0][0], end = intervals[0][1];
        for (vector<int>& interval : intervals) {
            if (end >= interval[0]) end = max(end, interval[1]);
            else { ans.push_back({ start, end }); start = interval[0]; end = interval[1]; }
        }
        ans.push_back({ start, end });

        return ans;
    }
};  

你可能感兴趣的:(LeetCode-Medium)