合并区间

<pre name="code" class="cpp">/**
 * Definition of Interval:
 * classs Interval {
 *     int start, end;
 *     Interval(int start, int end) {
 *         this->start = start;
 *         this->end = end;
 *     }
 */
class Solution {
public:
    static bool compare(const Interval &a, const Interval &b)  
    {  
        return a.start < b.start;  
    } // 规定了下面intervals进行排序(sort)时遵循的规则,即根据start升序排列
    /**
     * @param intervals: interval list.
     * @return: A new interval list.
     */
    vector<Interval> merge(vector<Interval> &intervals) {
        // write your code here
        vector<Interval> result;
        int n = intervals.size();
        if(n < 1){
            return result;
        }
        sort(intervals.begin(), intervals.end(), compare);  //根据start升序排列
        int left  = intervals[0].start;
        int right = intervals[0].end;
        for(int i = 1; i < n; i++){
            if(right >= intervals[i].start){
                right = max(right,intervals[i].end);
            }
            else{
                result.push_back(Interval(left, right));  
                left = intervals[i].start;  
                right = intervals[i].end; 
            }
        }
        result.push_back(Interval(left, right)); //!!!注意的地方
        return result;
    }
};


 

### 合并区间算法的C++实现 为了处理合并区间的逻辑,在C++中可以采用如下方法: ```cpp #include <vector> #include <algorithm> using namespace std; struct Interval { int start; int end; }; bool compareIntervals(const Interval& i1, const Interval& i2) { return i1.start < i2.start; } class Solution { public: vector<Interval> merge(vector<Interval>& intervals) { if (intervals.empty()) return {}; // Sort intervals based on starting point sort(intervals.begin(), intervals.end(), compareIntervals); vector<Interval> merged; merged.push_back(intervals[0]); for (size_t i = 1; i < intervals.size(); ++i) { Interval lastMerged = merged.back(); Interval current = intervals[i]; if (lastMerged.end >= current.start) { // Overlapping intervals found, update the latest interval's end. merged.back().end = max(lastMerged.end, current.end); } else { // Non-overlapping interval, add it as is. merged.push_back(current); } } return merged; } }; ``` 此代码片段展示了如何通过先对输入区间按起始位置排序,再遍历这些已排序区间来检测重叠情况从而完成合并操作[^1]。 #### 数据结构说明 - `Interval` 结构体用于表示单个区间,其中包含两个整数成员变量分别代表区间的起点 (`start`) 和终点 (`end`)。 - 使用布尔函数 `compareIntervals()` 来作为标准库中的 `sort()` 函数比较器,确保所有给定区间按照它们各自的起点升序排列。 #### 主要流程描述 - 首先检查传入的区间列表是否为空;如果为空,则直接返回空的结果。 - 对于非空的情况,初始化一个新的向量 `merged` 将第一个区间加入其中。 - 接下来迭代剩余未处理过的每一个新区间将其与当前最后一个被合并后的区间相比较: - 如果发现有交(即前一区间的结束大于等于新开始),则更新最后那个区间的结尾至两者最大值; - 若无交,则简单地把新的独立区间添加到结果中去。 #### 性能考量 该解决方案的时间复杂度主要取决于排序过程 O(n log n),而后续的一次线性扫描只需要 O(n)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值