• [LeetCode 56.] 合并区间


    LeetCode 56. 合并区间

    题目描述

    以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

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

    提示:

    • 1 <= intervals.length <= 104
    • intervals[i].length == 2
    • 0 <= starti <= endi <= 104

    解题思路

    两个区间合并的条件是,区间存在重叠。具体来讲:
    对于区间 [a1,b1][a2,b2],如果 a1 <= a2 && b1 >= a2 那么就可以认定两个区间可以合并,变成 [a1, max(b1,b2)]
    为了找到同时符合上述两个条件的区间并进行合并,我们可以预先进行一个排序操作,保证相邻两个区间都满足 a1 <= a2 这个条件,然后利用 b1 >= a2 这个条件来判断是否对区间进行合并。

    参考代码

    class Solution {
    public:
        vector<vector<int>> merge(vector<vector<int>>& intervals) {
            if (intervals.empty()) return {};
            vector<pair<int,int>> vec;
            for (auto&& v:intervals) {
                vec.push_back({v[0], v[1]});
            }
            sort(vec.begin(), vec.end());
            vector<vector<int>> res;
            int start = vec[0].first;
            int end = vec[0].second;
            for (auto&& [p1, p2] : vec) {
                if (end >= p1) {
                    end = max(end, p2);
                } else {
                    res.push_back({start, end});
                    start = p1;
                    end = p2;
                }
            }
            res.push_back({start, end});
            return res;
        }
    };
    
  • 相关阅读:
    Oracle设置某张表为只读
    greenplum不能下载问题解决方法(转)
    MyBatis学习-入门
    Oracle-数据泵使用
    oracle锁表
    linux查看文件大小
    Apache日志分割
    nginx日志切割
    zookeeper 事务日志查看
    zookeeper连接 org.apache.curator.framework.imps.CuratorFrameworkImpl Background exception was not retry-able or retry gave up [main-EventThread]
  • 原文地址:https://www.cnblogs.com/zhcpku/p/15207460.html
Copyright © 2020-2023  润新知