LeetCode hot 100—合并区间

题目

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

分析

排序法

首先,按区间的起始值进行排序。然后遍历每一个区间,检查当前区间是否与合并结果中的最后一个区间重叠。如果没有重叠,就直接将当前区间添加到结果中。如果有重叠,就更新合并数组中的最后一个区间的结束值。

时间复杂度:O(n\log_{}n),n为区间数量

空间复杂度:O(n),n为区间数量

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        // 如果输入为空,直接返回空数组
        if (intervals.empty()) return {};
        // 按照区间的起始值排序
        sort(intervals.begin(), intervals.end());
        // 用一个新的数组存储合并后的区间
        vector<vector<int>> merged;
        // 遍历每个区间
        for (const auto& interval : intervals) {
            // 如果合并数组为空,或者当前区间与合并数组的最后一个区间不重叠
            if (merged.empty() || merged.back()[1] < interval[0]) {
                merged.push_back(interval);  // 直接加入新区间
            } else {
                // 否则,合并区间,更新最后一个区间的结束值
                merged.back()[1] = max(merged.back()[1], interval[1]);
            }
        }
        return merged;
    }
};

知识充电

vector() 容器

vector() 是 C++ 标准库提供的一种动态数组容器。它的大小可以在运行时自动调整。与传统的数组不同,vector() 能够动态地增加和减少元素,并且提供了许多操作方法来方便地处理数据。

初始化

#include <vector>
std::vector<int> v1;  // 创建一个空的vector
std::vector<int> v2(5, 10);  // 创建一个包含 5 个元素,每个元素初始化为 10 的vector
std::vector<int> v3 = {1, 2, 3, 4};  // 使用初始化列表创建vector
std::vector<int> v4(v3);  // 通过拷贝构造函数创建一个新vector

常用成员函数

size()——返回 vector 中元素的数量
empty()——检查 vector 是否为空
resize()——改变 vector 的大小。若新大小大于原大小,新增的元素将被初始化为零(对于基础数据类型);若新大小小于原大小,vector 的大小将被减少到新大小
v3.resize(6, 100);  // 将 v3 的大小扩展到 6,并初始化新元素为 100
push_back()——向 vector 的末尾添加一个新元素
pop_back()——删除 vector 中的最后一个元素
front()——返回 vector 中的第一个元素
back()——返回 vector 中的最后一个元素
data()——指向第一个元素的指针
clear()——清空所有元素
insert()——在指定位置插入一个或多个元素
v3.insert(v3.begin() + 2, 50);  // 在索引为 2 的位置插入元素 50
v3.insert(v3.begin(), 2, 30);  // 在开始位置插入 2 个 30
erase()——删除指定位置的元素,或者删除指定范围内的元素
v3.erase(v3.begin() + 2);  // 删除索引为 2 的元素
v3.erase(v3.begin(), v3.begin() + 2);  // 删除前两个元素
swap()——交换两个 vector 的内容
std::vector<int> v5 = {10, 20, 30};
v3.swap(v5);  // 交换 v3 和 v5 的内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rigidwill666

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值