news 2026/2/10 13:30:37

刷题日记 合并区间

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
刷题日记 合并区间

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

示例 3:

输入:intervals = [[4,7],[1,4]]输出:[[1,7]]解释:区间 [1,4] 和 [4,7] 可被视为重叠区间。

好,这题本身不难,难在你第一次看代码时不知道每一步在“干嘛”。我按**“人话 + 逐行解释 + 例子”**给你讲一遍,你就能看懂了。


一、题目先用一句话说清楚

给你很多区间,比如:

[1,3] [2,6] [8,10] [15,18]

其中[1,3][2,6]有重叠
要合并成:

[1,6] [8,10] [15,18]

二、整体思路(非常重要)

三步走:

  1. 先排序(按区间起点从小到大)

  2. 从左到右扫描

  3. 用一个新数组merged存合并后的区间


三、代码逐行“翻译成人话”

1️⃣ 函数定义(不用管)

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

意思:
输入是[[1,3],[2,6],...]
输出也是同样格式


2️⃣ 如果没区间,直接返回空

if (intervals.size() == 0) { return {}; }

防止空数组出错


3️⃣ 排序(这是关键)

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

vector<int>默认按第一个元素 → 第二个元素排序

例如:

排序前: [ [2,6], [1,3], [8,10] ] 排序后: [ [1,3], [2,6], [8,10] ]

📌为什么要排序?
因为只有排好序,才能从左到右“挨个合并”


4️⃣ 定义结果数组

vector<vector<int>> merged;

👉 用来存已经合并好的区间


5️⃣ 开始遍历每个区间

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

每次拿一个区间


6️⃣ 当前区间的左右端点

int L = intervals[i][0], R = intervals[i][1];

比如当前区间是[2,6]
那么:

L = 2 R = 6

7️⃣ 判断:要不要新开一个区间?

if (!merged.size() || merged.back()[1] < L) {

这句话很关键,拆开看👇

情况 1:merged还是空的
!merged.size()

说明这是第一个区间

👉 直接放进去


情况 2:和上一个区间不重叠
merged.back()[1] < L

意思是:

上一个区间的右端点 < 当前区间的左端点

例如:

上一个: [1,3] 当前: [5,7]

没有交集


8️⃣ 不重叠 → 直接放进去

merged.push_back({L, R});

9️⃣ 否则:有重叠 → 合并

else { merged.back()[1] = max(merged.back()[1], R); }

📌 意思是:

把上一个区间的“右端点”拉长

例如:

上一个: [1,3] 当前: [2,6]

合并后:

[1,6]

所以用max(...)


🔟 循环结束,返回结果

return merged;

四、完整走一遍例子(最重要)

输入:

intervals = [[1,3],[2,6],[8,10],[15,18]]

排序后(本来就有序):

[1,3] [2,6] [8,10] [15,18]

过程:

当前区间merged 之前操作merged 之后
[1,3]放入[[1,3]]
[2,6][[1,3]]重叠 → 合并[[1,6]]
[8,10][[1,6]]不重叠[[1,6],[8,10]]
[15,18][[1,6],[8,10]]不重叠[[1,6],[8,10],[15,18]]

五、一句话总结(考试 / 面试版)

先按起点排序,然后遍历区间:
若当前区间与结果数组最后一个区间不重叠,则直接加入;
否则合并并更新右端点。


class Solution {

public:

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

if (intervals.size()==0){

return{};

}

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

vector<vector<int>> merge;

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

int L=intervals[i][0];

int R=intervals[i][1];

if(!merge.size()||merge.back()[1]<L){

merge.push_back({L,R});

}

else{

merge.back()[1]=max(merge.back()[1],R);

}

}

return merge;

}

};

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/7 18:18:26

当Ada记录类型含有可变长数组分量时的逆向分析

请看IDA生成的以下伪代码&#xff1a;char *a7;//函数的输入参数int v31; // ecxint v32; // ecxint v33; // edxint v34; // ebxint v35; // ecxint v36; // ecxint v37; // edxint v38; // eaxint v39; // edxv31 *a7;if ( v31 > 99 )v31 99;v32 (~(532 * v31 532) &g…

作者头像 李华
网站建设 2026/2/6 22:48:57

刀客doc:小米是时候切断和粉丝的脐带了

文/刀客doc(头条精选作者)刚刚&#xff0c;小米就“大熊事件”给出了一份相对完整的处理结果。公司发言人通过官微回应&#xff0c;公布了内部调查结论&#xff0c;文中称&#xff1a;“因为米粉&#xff0c;所以小米。米粉的信任和支持&#xff0c;是小米不断前行的基石。我们…

作者头像 李华
网站建设 2026/2/7 3:14:40

晶台光耦在储能系统中的作用

光耦在储能系统中通过电气隔离实现高压与低压电路的安全隔离&#xff0c;是保障系统稳定运行的关键器件。晶台光耦KL1018/KL1019系列采用LSOP4封装&#xff0c;具备5KV隔离电压及-55~110℃宽温特性&#xff0c;广泛应用于太阳能储能逆变器。其红外发射二极管与光电晶体管耦合结…

作者头像 李华
网站建设 2026/2/6 7:27:17

虎贲等考 AI:AI 重构学术写作生态,全流程智能辅助赋能科研新可能

在学术探索的道路上&#xff0c;从选题构思到答辩收官&#xff0c;科研工作者与学子常被文献搜集繁琐、数据支撑薄弱、格式规范复杂、查重降重棘手等问题困扰。虎贲等考 AI 作为一款依托前沿人工智能技术打造的专业论文写作辅助工具&#xff0c;以 “全流程覆盖、高专业保障、强…

作者头像 李华
网站建设 2026/2/5 12:46:08

写论文软件哪个好?虎贲等考 AI 凭 “学术闭环力” 稳坐首选

毕业季的论文攻坚战&#xff0c;“写论文软件哪个好” 成了学子圈的高频拷问。有的软件文献引用虚拟无据&#xff0c;有的生成内容缺乏数据支撑&#xff0c;有的功能碎片化需反复切换工具 —— 真正靠谱的写论文软件&#xff0c;既要 “写得快”&#xff0c;更要 “写得专业、写…

作者头像 李华