问题描述 :
一个整数区间 [a, b] ( a < b ) 代表着从 a 到 b 的所有连续整数,包括 a 和 b。给你一组整数区间intervals,请找到一个最小的集合 S,使得 S 里的元素与区间intervals中的每一个整数区间都至少有2个元素相交。
输出这个最小集合S的大小。
示例 1:
输入: intervals = [[1, 3], [1, 4], [2, 5], [3, 5]]
输出: 3
解释:考虑集合 S = {2, 3, 4}. S与intervals中的四个区间都有至少2个相交的元素。且这是S最小的情况,故我们输出3。
示例 2:
输入: intervals = [[1, 2], [2, 3], [2, 4], [4, 5]]
输出: 5
解释:最小的集合S = {1, 2, 3, 4, 5}.
输入说明 :
首先输入intervals 的区间个数m(范围为[1, 3000]),然后输入m行,每行2个数字( [0, 10^8]范围内的整数),表示区间的左、右边界。
输出说明 :
输出一个整数
输入范例 :
4
1 2
2 3
2 4
4 5
输出范例 :
5
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
static bool cmp(vector<int> a,vector<int> b){
return a[0] != b[0] ? a[0] < b[0] : a[1] > b[1];
}
int intersectionSizeTwo(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end(),cmp);//对 intervals按照左端点升序 右端点降序排列
vector<int> v;
for(int i = intervals.size() - 1 ; i >= 0 ; i--){
if(!v.size()){//当size()==0时 首次添加两个
v.push_back(intervals[i][0] + 1);
v.push_back(intervals[i][0]);
}
else{
int flag = 0;
for(int j = v.size() - 1 ; j >= 0 ; j--){//判断v的尾元素是否与当前区间有交集
if(v[j] > intervals[i][1] || flag == 2)
break;
if(v[j] <= intervals[i][1] && v[j] >= intervals[i][0])
flag++;
}
if(flag == 0){//两个区间无交集
v.push_back(intervals[i][0] + 1);
v.push_back(intervals[i][0]);
}
if(flag == 1){//两个区间有一个交集
v.push_back(intervals[i][0]);
}
}
}
return v.size();
}
int main(){
int m,n,data;
vector<vector<int>> intervals;
cin>>m;
for(int j=0; j<m; j++){
vector<int> aRow;
for(int i=0; i<2; i++){
cin>>data;
aRow.push_back(data);
}
intervals.push_back(aRow);
}
int res=intersectionSizeTwo(intervals);
cout<<res;
return 0;
}