力扣练习——30 设置交集大小至少为2
1.问题描述
一个整数区间 [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}.
可使用以下main函数:
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=Solution().intersectionSizeTwo(intervals);
cout<<res;
return 0;
}
2.输入说明
首先输入intervals 的区间个数m(范围为[1, 3000]),
然后输入m行,每行2个数字( [0, 10^8]范围内的整数),表示区间的左、右边界。
3.输出说明
输出一个整数
4.范例
输入
4
1 2
2 3
2 4
4 5
输出
5
5.代码
#include<iostream> #include<vector> #include<string> #include<algorithm> #include<unordered_map> #include<set> #include<stack> using namespace std; bool cmp(vector<int>&a, vector<int> &b)//定义比较函数,注意这里参数的写法 { return a[1]<b[1]||(a[1]==b[1]&&a[0]>b[0]);//先按照 第二个元素 升序比较 ,相等的话按 第一个元素 降序 } int intersectionSizeTwo(vector<vector<int> > &intervals) { //1.先按照右端点升序,左端点降序 sort(intervals.begin(), intervals.end(), cmp); //2.定义初始结果数组 vector<int>v{ -1,-1 }; //3.遍历 for (auto val : intervals) { int len = v.size(); if (val[0] <= v[len - 2]) continue;//说明一定有两个重复元素,所以不添加元素也有两个重复的 if (val[0] > v.back()) v.push_back(val[1] - 1);//说明v数组和当前区间没有一个交集,所以这里取两个最大的元素添加进去 v.push_back(val[1]); } return v.size()-2; } 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<<endl; return 0; }

浙公网安备 33010602011771号