leetcode练习题:设置交集大小至少为2
问题描述 :
一个整数区间 [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}.
#include<iostream>
#include<queue>
#include<unordered_map>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
static bool cmp(vector<int>& a,vector<int>& b)
{
return a[0]==b[0]?a[1]>b[1]:a[0]<b[0];//第一个元素相等则按照第二个元素递减排序,不等则按照第一个元素递增排序。
}
int intersectionSizeTwo(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end(),cmp);
vector<int> a(intervals.size(),2);//记录每个数组中需要至少包含数的剩余个数
int res=0;//记录一共需要的个数
int k=intervals.size();
while(--k>=0)//遍历每个数组
{
int s=intervals[k][0];
int m=a[k];
for(int p=s;p<s+m;++p)
{
for(int i=0;i<4k;i++)
{
if(a[i]>0&&p<=intervals[i][1])
a[i]--;
}
res++;
}
}
return res;
}
};
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;
}