区间合并模板

/*
给定 n 个区间 [li,ri],要求合并所有有交集的区间。

注意如果在端点处相交,也算有交集。

输出合并完成后的区间个数。

例如:[1,3]和[2,6]可以合并为一个区间[1,6]。
*/

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

vector<pair<int, int>> A;
int n;

void merge(vector<pair<int, int>>& B)
{
    vector<pair<int, int>> Res;

    int st = -2e9, ed = -2e9; // 方便比较的过程

    for (auto it : B)
    {
        if (ed < it.first) // 不可以合并的情况
        {
            if(st != -2e9) // 没有这个判定的话就会把最开始的初始区间也给压入
            Res.push_back({ st,ed });

            st = it.first;
            ed = it.second;
        }
        else // 可以合并的情况 包括区间端点重合和区间完全包含这两种情况
        {
            ed = max(ed, it.second);
        }

    }

    if (st != -2e9) Res.push_back({ st,ed }); // 用来存入最后一组区间端点
    //比如样例中的
    /* 5
       1 2
       2 4
       5 6
       7 8
       7 9 最后一个7 9 可以和7 8 进行合并但是程序只是将现在的区间的ed改为了9而没有将7 9这组区间压入vector中
    */

    B = Res;
}

int main(void)
{
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        int l, r;
        cin >> l >> r;
        A.push_back({ l,r });
    }

    sort(A.begin(), A.end()); // sort函数对pair类型的对象进行排序操作,默认是先对第一个first进行排序

    merge(A);

    cout << endl;
    /*for (auto it : A)
    {
        cout << it.first << " " << it.second << endl;
    }*/

	cout<<A.size()<<endl;
	
    return 0;
}
好的,以下是一个简单的用C语言实现区间合并的代码模板: ```c #include <stdio.h> // 定义区间结构体 typedef struct interval { int start; int end; } Interval; // 区间合并函数 Interval* merge_intervals(Interval* intervals, int size, int* returnSize) { if (size <= 1) { *returnSize = size; return intervals; } // 将区间按照起点从小到大排序 for (int i = 0; i < size; i++) { for (int j = i + 1; j < size; j++) { if (intervals[i].start > intervals[j].start) { Interval temp = intervals[i]; intervals[i] = intervals[j]; intervals[j] = temp; } } } // 合并区间 Interval* result = (Interval*)malloc(sizeof(Interval) * size); int index = 0; result[0] = intervals[0]; for (int i = 1; i < size; i++) { if (result[index].end >= intervals[i].start) { result[index].end = fmax(result[index].end, intervals[i].end); } else { index++; result[index] = intervals[i]; } } *returnSize = index + 1; return result; } // 测试 int main() { Interval intervals[] = {{1, 3}, {2, 6}, {8, 10}, {15, 18}}; int size = sizeof(intervals) / sizeof(intervals[0]); int returnSize; Interval* result = merge_intervals(intervals, size, &returnSize); printf("["); for (int i = 0; i < returnSize; i++) { printf("[%d, %d]", result[i].start, result[i].end); if (i != returnSize - 1) { printf(", "); } } printf("]\n"); free(result); return 0; } ``` 这个代码模板的实现思路是:先按照区间起点从小到大排序,然后依次合并相邻的区间,如果相邻两个区间不能合并,则将当前区间加入结果中。最后返回合并后的区间数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值