LeetCode题解——56. 合并区间

题目相关

题目链接

LeetCode中国,https://leetcode-cn.com/problems/merge-intervals/。

题目描述

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

示例

示例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] 可被视为重叠区间。

题目分析

LeetCode 给出本题难度中等。

题意分析

将给出的区间进行合并,就是讲有重叠的区间进行合并。比如我们给出区间 [1, 3], [1,4],很明显这两个区间是重叠的,所以可以合并称为一个新区间 [1,4]。

样例数据分析

样例数据1

1、第一个区间为 [1,3],第二个区间为 [2,6]。很明显这两个区间是重叠的,重叠部分为 [2,3],这样我们可以将这两个区间合并为 [1,6]。这样样例数据变为 [[1,6],[8,10],[15,18]]。

2、第一个区间为 [1,6],第二个区间为 [8,10]。很明显这两个区间是不重叠的。这样样例数据不变。

3、第二个区间为 [8,10],第三个区间为 [15,18]。很明显这两个区间是不重叠的。这样样例数据不变。

4、这样我们遍历完所有区间,最终的输出结果为 [[1,6],[8,10],[15,18]]。

样例数据2

1、第一个区间为 [1,4],第二个区间为 [4,5]。很明显这两个区间是重叠的,重叠部分为 [2,3],这样我们可以将这两个区间合并为 [1,5]。这样样例数据变为 [[1,5]]。

2、这样我们遍历完所有区间,最终的输出结果为 [[1,5]]。

算法设计

1、由于题目没有明确说明区间是排序的,第一步我们先将区间进行排序,按照开始位置从小到大排序。

2、使用双指针法,对区间进行遍历。比较两个区间,是否要合并。如果需要合并,合并区间继续比较。如果不需要合并,更新指针位置,继续比较。

细节

排序

我们可以直接使用 STL 的排序函数进行排序即可。

判断区间是否重合

只需要比较当前区域的结束位置和下一个区域的开始位置关系即可。

区间合并

结束位置要取当前区间结束位置和下一个区间结束位置的最大值。因为根据数学关系,我们知道两个区间存在三种关系:不相交、相交、属于。如下图所示。

LeetCode题解——56. 合并区间_第1张图片

AC 参考代码

class Solution {
public:
    vector> ans;
    vector> merge(vector>& intervals) {
        int size = intervals.size();
        if (0==size) {
            return ans;
        }

        //先把区间集合按照左端点从小到大进行排序
        sort(intervals.begin(), intervals.end(), less>());

        //遍历合并
        vector curr = intervals[0]; //当前区间
        vector next; //下一个区间
        for (int i=1; i=intervals[i][0]) {
                //区间重叠
                curr[1] = max(curr[1], intervals[i][1]);
            } else {
                ans.push_back(curr);
                curr = intervals[i];
            }
        }
        ans.push_back(curr);
        
        return ans;
    }
};

LeetCode题解——56. 合并区间_第2张图片

你可能感兴趣的:(OJ题解,#,LeetCode题解)