惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

宝玉的分享
宝玉的分享
Engineering at Meta
Engineering at Meta
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 聂微东
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Last Week in AI
Last Week in AI
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog
Apple Machine Learning Research
Apple Machine Learning Research
Hugging Face - Blog
Hugging Face - Blog
爱范儿
爱范儿
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
Jina AI
Jina AI
博客园 - 叶小钗
雷峰网
雷峰网
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - Franky
WordPress大学
WordPress大学
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
阮一峰的网络日志
阮一峰的网络日志
量子位

博客园 - 新西兰程序员

C++ 构造函数中的初始化参数列表initializer list C++中的线程thread,以及C++11中的std::atomic学习 C++中的内存对齐 C++中的static关键字使用以及全局变量 C++17中的结构化绑定Structured Binding C++中的函数参数是指针类型, 是按值传递 C++中异常处理机制中的栈展开stack unwinding C++实现链表反转 Linux中的性能分析工具 perf 来分析C++性能 C++17中新建一个类时,编译器默认生成的类成员函数 QT中的元对象系统 Leetcode 114 - 二叉树展开为链表 Leetcode65 有效数字 - 判断给定的字符串是否是一个有效数字 LettCode2289-Steps to Make Array Non-descreasing C#中的委托详解 C++中的std::function C++中的仿函数Functor C++中的const和constexpr异同比较 C++中的左值和右值,以及右值引用,移动语义 C++中传递参数是指针类型以及传入参数是指针的指针(**)详解 C++中GetTickCount函数学习 C++中以类的成员函数作为Windows callback函数需要设置成static函数 C#中的System.Security.SecureString学习 C++中的悬挂指针和野指针 C++中四种不同的对象生存方式(in stack, in heap, global, local static) C#中使用Parallel类来进行多线程并发编程 String类型转LPCTSTR -----理解C++中的字符串类型转换 C++中的虚函数和虚函数表 C++中基类指针指向派生类对象 数据结构 - 栈的学习
Leetcode56 Merge Intervals 合并区间 -- C++实现
新西兰程序员 · 2026-05-19 · via 博客园 - 新西兰程序员

这个题目是关于一个合并区间的算法题目,我们来看C++的实现

Give multiple intervals, return the merged list之后的集合 比如 [[0,7],[2,3],[4,5]] 输出[0,7], y因为都在0到7的区间

Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
Input: [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.

给定一个区间的集合,合并所有重复的区间。

也就是将重复的区间合并成一个大的区间,例如[1,5]和[3,7]将会合并成[1,7]

1.  先将区间按左端点值由小到大排序, 比如   [[2,6],[15,18],[8,10],[1,3]], 按照里面每个区间的左端点排序,排序完成后变成   [[1,3],[2,6],[8,10],[15,18]]

2.  定义一个返回值区间 vector<verctor<int>> res;

3.  先把第1步中排完序的区间中的第1个(位置为0)的区间,也就是上面例子中的[1,3] 放入第2步定义的返回值res中 => 此时 res = [[1,3]]

4. 遍历循环第1步中左端点排序后的区间,从位置1开始(因为位置为0的区间已经放入res中),一个一个循环

    每一个区间都和res中的最后一个区间进行比较(刚开始res中只有一个区间,就是[1,3]),

    如果比较的这个区间的左端值 <  res中最后一个区间的右端值, 那就说明有重叠,把这个区间和res最后一个区间合并成一个新的区间 

    否则,就是没有重叠,直接把比较的这个区间,放入res的尾部

代码如下

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<vector<int>> merge(vector<vector<int>>& intervals) {
    if (intervals.empty()) return {};

    // Step 1: Sort by start time
    sort(intervals.begin(), intervals.end());

    vector<vector<int>> res;
    res.push_back(intervals[0]);

    for (int i = 1; i < intervals.size(); ++i) 
    {
        auto& last = res.back();
        int currStart = intervals[i][0];
        int currEnd = intervals[i][1];

        if (currStart <= last[1]) 
        {
            // Overlap: merge
            last[1] = max(last[1], currEnd);
        } 
        else 
        {
            res.push_back({currStart, currEnd});
        }
    }

    return res;
}