leetcode - 56. 合并区间

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

示例 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)
链接:https://leetcode-cn.com/problems/merge-intervals
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
——————
解题思路:首先对给定数组进行排序,排序后进行区间重叠判断。

创建两个指标beg和en,beg是遍历至当前区间的最小值,en是遍历至当前区间的最大值。

当新来一个区间时,如果该区间的起始点的值小于en值,且同时该区间的终点值大于en值,则更新en值的状态。

如果当前区间的最小值大于en的值,则将[beg,en]区间放进二维集合中。

然后更新beg和en的值,继续遍历,直到遍历结束。

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if(intervals.size()==0||intervals[0].size()==0)  # 如果二维集合为空,直接返回
            return intervals;
        sort(intervals.begin(),intervals.end());  # 对二维集合进行排序
        vector<vector<int>> dp;  # 创建一个二维集合用于存储重叠后的区间
        int beg = intervals[0][0];  # 创建一个临时变量,用于标记区间的起始值
        int en = intervals[0][1];  # 创建一个临时变量,用于标记区间的终点值
        for(int i=0;i<intervals.size();++i)  # 变量排序后的每一个区间
        {
            if(intervals[i][0]<=en)  # 如果该区间的起始值小于当前en的值
            {
                if(intervals[i][1]>en)  # 判断该区间的终点值是否大于当前的en值,如果大于,则更新当前en的值
                    en = intervals[i][1];
            }
            else  # 如果区间的起始值大于当前的en值,则可以将beg和en组成的区间放进二维集合dp中
            {
                dp.push_back({beg,en});
                beg = intervals[i][0];  # 更新beg的值
                en = intervals[i][1];  # 更新en的值
            }
            if(i==intervals.size()-1)  #如果遍历到最后一个数,直接将最后一个beg和en组成的区间放进二维区间中
                dp.push_back({beg,en});
            
        }
        return dp;  # 返回二维区间
    }
};

你可能感兴趣的:(LeetCode算法题)