Java教程

区间合并

本文主要是介绍区间合并,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

给定 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

 

 

 

 

解法:排序+贪心

首先将所有区间按左端点从小到大排序,那么假设当前合并到的区间右端为ed,则ed与下一个区间的左端点的关系有且仅有以下三种情况:

①range[i].l < ed => 直接合并,且ed不变

②range[i].l < ed => 直接合并,ed更新为range[i].r

③无法合并,说明需要新开一个区间,答案加1并更新ed为range[i].r

 

 

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 const int N = 100009;
 5 struct Range
 6 {
 7     int l,r;
 8     bool operator <(const Range& w) const
 9     {
10         return l < w.l;
11     }
12 }range[N];
13 int n,res;
14 
15 int main()
16 {
17     cin >> n;
18     for(int i = 0;i < n;++i)
19     {
20         int a,b;
21         cin >> a >> b;
22         range[i] = {a,b};
23     }
24     sort(range,range + n);
25     int ed = -2e9;
26     for(int i = 0;i < n;++i)
27     {
28         if(range[i].l > ed)
29         {
30             res++;
31             ed = range[i].r;
32         }
33         else
34             ed = max(ed,range[i].r);
35     }
36     cout << res << endl;
37     return 0;
38 }

 

这篇关于区间合并的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!