力扣leetcode 56. 合并区间

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

题解思路

这题排序完直接比较就好了 和先前发过 🔗 无重叠区间 这道题有点像 但更简单 不用贪心思想
示例1就是排序的结果 这样第一个元素的左右端点设为L,R 推进merge后 即是 [merge.back()[0], merge.back()[1]] 之后再把[2, 6]设为[L, R] 比较
直接上代码

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if (intervals.size() == 0) {
            return {};
        }
        sort(intervals.begin(), intervals.end());   // 直接默认非递减排序
        vector<vector<int>> merged;   // 这是最终的结果容器vector
        for (int i = 0; i < intervals.size(); ++i) {
            int L = intervals[i][0], R = intervals[i][1];   // 第i个元素(也为vector)的 0 号位为L左端点  1号为R右端点
            if (!merged.size() || merged.back()[1] < L) {   // !merged.size()是为了第一个元素进入而设置 之后都从结果容器的最后一个元素取出其1号(R)和
                merged.push_back({L, R});                  // 当前的L比较 若是小于 说明没有交集 不合并 直接把当前元素{L,R}推进
            }
            else {
                merged.back()[1] = max(merged.back()[1], R);  // 这是需要合并 说明已存在的R坐标大于新进的L 出现交集 这样直接更新已存在的R右坐标为二者较大的
            }
        }
        return merged;
    }
};
posted @ 2020-04-16 23:30  CoderZjz  阅读(238)  评论(0编辑  收藏  举报