LeetCode算法刷题——56. 合并区间

一、题目描述

二、解题思路

我们使用排序+贪心的算法来合并区间:

  1. 首先按照区间的左端点 进行排序

  2. 把第一个区间直接放到result里

  3. 遍历剩余的intervals数组区间元素,逐个判断是否可以合并

  4. 若可合并,修改结果result中的最后一个元素**(更新右端点为较大的值)**

  5. 若不可合并,直接添加到结果result中

三、完整代码

class Solution {

public:

vector<vector<int>> merge(vector<vector<int>>& intervals) {

vector<vector<int>> result;

// 按照区间左端点排序

sort(intervals.begin(), intervals.end());

for(int i = 0; i < intervals.size(); i++) {

// 如果结果为空或当前区间与结果最后一个区间不重叠

if(result.empty() || result.back()[1] < intervals[i][0]) {

result.push_back(intervals[i]);

}

// 否则合并区间

else {

result.back()[1] = max(intervals[i][1], result.back()[1]);

}

}

return result;

}

};

四、代码解析

1. 排序操作

sort(intervals.begin(), intervals.end());

  • 按照区间左端点从小到大排序

  • 对于二维数组,默认按第一列(左端点)排序

  • 排序后,可能重叠的区间会相邻

2. 结果数组的操作

result.back()[1]

  • result.back():获取结果数组中的最后一个区间

  • [1]:访问该区间的右端点

  • [0]:访问该区间的左端点

3. 判断是否重叠

if(result.empty() || result.back()[1] < intervals[i][0])

  • 条件1:结果数组为空,直接添加

  • 条件2:当前区间的左端点 > 结果最后一个区间的右端点 → 不重叠

  • 满足任一条件就创建新区间

4. 合并区间

result.back()[1] = max(intervals[i][1], result.back()[1]);

  • 当前区间与结果中最后一个区间重叠

  • 更新结果最后一个区间的右端点

  • 取两个区间右端点的较大值

五、语法要点

1. vector v.back()

vector<int> v = {1, 2, 3};

cout << v.back(); // 输出3,最后一个元素

vector<vector<int>> intervals;

intervals.back(); // 返回最后一个区间(一个vector<int>)

intervals.back()[0]; // 访问最后一个区间的左端点

intervals.back()[1]; // 访问最后一个区间的右端点

特点

  • 返回对最后一个元素的引用

  • 如果vector为空,调用back()会导致未定义行为

  • 通常需要先检查是否为空:if(!v.empty())

2. 二维vector的排序

vector<vector<int>> intervals;

sort(intervals.begin(), intervals.end());

  • 默认按字典序排序:先比较第一个元素,相同再比较第二个

  • 这正是我们需要的:按区间左端点排序

3. v.back() 的扩展用法

// 1. 修改最后一个元素

result.back() = {1, 5}; // 直接赋值

// 2. 获取最后一个区间的引用

vector<int>& lastInterval = result.back();

// 3. 使用pop_back()移除最后一个区间

result.pop_back();

// 4. // 获取第一个区间(同样需要确保非空)

result.front();

六、执行示例

输入:[[1,3],[2,6],[8,10],[15,18]]

执行过程:

  1. 排序后:[[1,3],[2,6],[8,10],[15,18]]

  2. i=0: result空 → 添加[1,3]

  3. i=1: 当前[2,6], result最后[1,3] → 2<3(重叠) → 合并 → [1,max(3,6)=6]

  4. i=2: 当前[8,10], result最后[1,6] → 8>6(不重叠) → 添加[8,10]

  5. i=3: 当前[15,18], result最后[8,10] → 15>10(不重叠) → 添加[15,18]

最终结果: [[1,6],[8,10],[15,18]]

七、总结

本文介绍了合并重叠区间的高效算法。通过先按左端点排序,然后遍历并合并重叠区间,我们可以在O(n log n)时间复杂度内解决问题。关键点包括:理解排序的重要性、掌握result.back()的用法、以及正确处理区间的合并逻辑。算法简洁高效,是处理区间问题的经典解法。

相关推荐
郝学胜-神的一滴1 天前
《机器学习》经典教材全景解读:周志华教授匠心之作的技术深探
数据结构·人工智能·python·程序人生·机器学习·sklearn
平哥努力学习ing1 天前
《数据结构》-第八章 排序
数据结构·算法·排序算法
CoovallyAIHub1 天前
为AI装上“纠偏”思维链,开源框架Robust-R1显著提升多模态大模型抗退化能力
深度学习·算法·计算机视觉
coderxiaohan1 天前
【C++】C++11
开发语言·c++
雾岛听蓝1 天前
C++优选算法 | 双指针篇(一)
开发语言·c++
小棠师姐1 天前
随机森林原理与实战:如何解决过拟合问题?
算法·机器学习·随机森林算法·python实战·过拟合解决
穿小甲的技术笔记1 天前
C++ static_cast 解析:零成本的类型安全转换
c++
明洞日记1 天前
【VTK手册036】网格拓扑简化工具:vtkCleanPolyData 使用指南
c++·图像处理·ai·vtk·图形渲染
wakaka_Yu1 天前
COLMAP 3.13.0 + CUDA 12.9 + Ubuntu24.04 编译
c++
范纹杉想快点毕业1 天前
欧几里得算法与扩展欧几里得算法,C语言编程实现(零基础全解析)
运维·c语言·单片机·嵌入式硬件·算法