给你一个区间的数组 arr[N][2],每个区间用 [start, end) 表示(包含端点)。请返回在数轴上任意一点,同时重叠的最大区间数量。
-
输入:
arr = [[1, 2], [2, 4], [3, 6]] -
输出:
2 -
解释: 在
3,[2,4]和[3,6]重叠(共 2 个)。
每个区间 [start, end) 拆成两个事件:
-
(start, +1):进入这个区间,覆盖数 +1 -
(end, -1):离开这个区间,覆盖数 -1
把所有事件按坐标排序,然后从左到右扫描,用一个变量 cnt 维护当前覆盖数,过程中记录最大值。
cpp
#include<bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;
int maxOverlap(vector<vector<int>>& nums){
vector<pii> events;
for(int i=0;i<nums.size();i++){
events.emplace_back(nums[i][0],1);
events.emplace_back(nums[i][1],-1);
}
sort(events.begin(),events.end(),[](const pii& a, const pii& b){
if(a.first != b.first){
return a.first<b.first;
}
return a.second<b.second;
});
int cnt=0;
int ans=0;
for(auto p:events){
cnt+=p.second;
ans=max(ans,cnt);
}
return ans;
}
int main(){
int n;
cin>>n;
vector<vector<int>> nums;
for(int i=0;i<n;i++){
int s,e;
cin>>s>>e;
nums.push_back({s,e});
}
cout<<maxOverlap(nums)<<endl;
return 0;
}