【算法】【区间合并】acwing算法基础 803. 区间合并

题目

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

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

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

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

输入格式

第一行包含整数 n。

接下来 n 行,每行包含两个整数 l 和 r。

输出格式

共一行,包含一个整数,表示合并区间完成后的区间个数。

数据范围

1≤n≤100000

−109≤li≤ri≤109

输入样例:

5

1 2

2 4

5 6

7 8

7 9

输出样例:

3

来源:acwing算法基础 803. 区间合并


思路(注意事项)


纯代码

#include
using namespace std;
vector<pair<int, int>> p;

int main()
{
	int  n;
	cin >> n;
	
	for (int i = 0; i < n; i ++)
	{
		int l, r;
		scanf("%d%d", &l, &r);
		p.push_back({l, r});
	}
	sort (p.begin(), p.end());
	
	int ed = p[0].second, sum = 1;
	for (int i = 1; i < n; i ++)
	{
		if (ed >= p[i].first) ed = max (ed, p[i].second);
		else {
			sum ++;
			ed = p[i].second;
		} 
	}

	cout << sum;
	
	return 0;
} 

题解(带注释)

#include
using namespace std;

vector<pair<int, int>> p;  // 存储所有区间

int main()
{
    int n;
    cin >> n;  // 输入区间的数量

    // 输入每个区间
    for (int i = 0; i < n; i++)
    {
        int l, r;
        scanf("%d%d", &l, &r);  // 输入区间的左端点和右端点
        p.push_back({l, r});  // 将区间存入向量p
    }

    // 对所有区间按左端点进行升序排序
    sort(p.begin(), p.end());

    int ed = p[0].second;  // 初始化当前合并区间的右端点为第一个区间的右端点
    int sum = 1;  // 初始化合并后的区间数量为1

    // 遍历所有区间,合并重叠区间
    for (int i = 1; i < n; i++)
    {
        if (ed >= p[i].first)  // 如果当前区间与上一个合并区间有重叠
        {
            ed = max(ed, p[i].second);  // 更新合并区间的右端点
        }
        else  // 如果没有重叠
        {
            sum++;  // 新区间数量加1
            ed = p[i].second;  // 更新当前合并区间的右端点
        }
    }

    // 输出合并后的区间数量
    cout << sum;

    return 0;
}

你可能感兴趣的:(算法,输入输出,算法,c++,区间合并)