区间合并问题

区间合并

贪心思想

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) 
    {
        vector<vector<int>> res;

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

        vector<int> sted(2, -1);
        for (int i = 0; i < intervals.size(); i++)
            if (intervals[i][0] > sted[1])
            {
                if (sted[0] != -1) res.push_back(sted);
                sted[0] = intervals[i][0], sted[1] = intervals[i][1];
            }
            else sted[1] = max(sted[1], intervals[i][1]);
        if (sted[0] != -1) res.push_back(sted);

        return res;
    }
};
### C++ 中的区间合并算法 在处理区间合并问题时,通常会遇到多个不连续的时间段或者数值范围需要进行合并的情况。对于此类问题,在C++中的解决方案可以利用标准模板库(STL),特别是`vector`容器来存储区间的集合,并通过自定义比较函数来进行排序和合并操作。 #### 区间表示结构体定义 为了方便管理和计算各个独立区间之间的关系,首先应当创建一个简单的数据结构用于保存每一段的具体信息: ```cpp struct Interval { int start; int end; bool operator<(const Interval& other) const { return this->start < other.start || (this->start == other.start && this->end < other.end); } }; ``` 此部分代码定义了一个名为 `Interval` 的结构体用来封装单个区间的起始位置(`start`)以及终止位置(`end`)。同时重载了小于运算符以便后续能够按照起点升序排列这些对象[^2]。 #### 合并逻辑实现 接下来就是核心的部分——如何有效地完成所有给定区间的合并工作。这里提供了一种基于遍历的方法,其基本原理是在每次迭代过程中尝试将当前考察到的新加入者与其前驱相邻接合在一起形成更大的整体;如果无法做到这一点,则说明遇到了一个新的独立片段,应该将其单独记录下来等待下一轮可能存在的进一步融合机会。 ```cpp #include <iostream> #include <vector> using namespace std; // ... 上述 Interval 结构体 ... void mergeIntervals(vector<Interval>& intervals, vector<Interval>& result){ sort(intervals.begin(), intervals.end()); for(auto interval : intervals){ // 使用增强型for循环简化语法[C++11新特性] if(result.empty() || result.back().end < interval.start){ result.push_back(interval); }else{ result.back().end = max(result.back().end, interval.end); } } } ``` 上述代码实现了完整的区间合并功能。其中先调用了内置的快速排序方法对输入参数进行了预处理以确保它们按顺序排列;之后再逐一遍历每一个待处理项决定是否要更新现有列表的最后一项还是新增加一项进去。 #### 完整示例程序 最后给出一个完整的例子展示整个过程的工作流程: ```cpp int main(){ vector<Interval> input{{1,3},{2,6},{8,10},{15,18}}; vector<Interval> output; mergeIntervals(input,output); cout << "Merged Intervals are:" << endl; for(const auto& item : output){ printf("[%d,%d]",item.start,item.end); putchar(' '); } return 0; } ``` 运行这段代码将会得到如下输出结果: ``` Merged Intervals are: [1,6] [8,10] [15,18] ``` 这表明原本四个相互交错的小片已经被成功组合成了三个较大的连贯区域。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值