力扣练习——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;
}

 

posted @ 2022-07-19 17:50  努力奋斗的小企鹅  阅读(57)  评论(0)    收藏  举报