LeetCode 757. 设置交集大小至少为2
题目描述
一个整数区间 [a, b] ( a < b ) 代表着从 a 到 b 的所有连续整数,包括 a 和 b。
给你一组整数区间intervals,请找到一个最小的集合 S,使得 S 里的元素与区间intervals中的每一个整数区间都至少有2个元素相交。
输出这个最小集合S的大小。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/set-intersection-size-at-least-two
思路
使用贪心的方法来解决,将各个区间段按照左边界升序排列,左边界相同按照右边界降序排列。然后从最后一个序列开始往上面找,每次都尽量找靠左边的点,因为我们找的点越靠左边,就越有可能被包含在上面的区间内,这也是本题贪心的关键所在。使用left,right两个变量来维护我们所求集合中最小的两个数。
代码
class Solution {
public:
int intersectionSizeTwo(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end(),[](vector<int> & a, vector<int> & b){
if(a[0]==b[0])
{
return a[1]>b[1];
}
return a[0]<b[0];
});//排序:按照左边界升序,相同的话按照右边界降序
int n= intervals.size();
int left = intervals[n-1][0];
int right = left+1;
int ans=2;
for(int i=n-2;i>=0;i--)
{
if(intervals[i][1]>=right)
continue;
if(intervals[i][1]<left)
{
ans+=2;
left = intervals[i][0];
right = left+1;
}
else
{
ans++;
right=left;
left=intervals[i][0];
}
}
return ans;
}
};
收获
- 除了本题思路之外,知道了
sort
排序自定义排序方法的另一种写法。 - 以及
vector
的用法进一步丰富。