跳到主要内容

757.设置交集大小至少为2

链接:757.设置交集大小至少为2
难度:Hard
标签:贪心、数组、排序
简介:输出这个最小集合 S 的大小。

题解 1 - cpp

  • 编辑时间:2022-07-22
  • 执行用时:212ms
  • 内存消耗:55MB
  • 编程语言:cpp
  • 解法介绍:贪心,排序后对于两个区间进行假定,如果无交集则说明集合数加二,如果包容则说明只需考虑最小区间。
class Solution {
public:
int intersectionSizeTwo(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(),
[&](vector<int> a, vector<int> b) -> bool {
return a[0] == b[0] ? a[1] > b[1] : a[0] < b[0];
});
int n = intervals.size(), l = intervals[n - 1][0], r = l + 1, ans = 2;
for (int i = n - 2; i >= 0; i--) {
if (intervals[i][1] >= r)
continue;
else if (intervals[i][1] < l) {
ans += 2;
l = intervals[i][0];
r = l + 1;
} else {
r = l;
l = intervals[i][0];
ans++;
}
}
return ans;
}
};

题解 2 - rust

  • 编辑时间:2022-07-22
  • 执行用时:4ms
  • 内存消耗:2.3MB
  • 编程语言:rust
  • 解法介绍:同上。
impl Solution {
pub fn intersection_size_two(intervals: Vec<Vec<i32>>) -> i32 {
let mut intervals = intervals;
intervals.sort_by(|v1, v2| {
if v1[0] == v2[0] {
v2.cmp(v1)
} else {
v1.cmp(v2)
}
});
let n = intervals.len() as i32;
let mut l = intervals[(n - 1) as usize][0];
let mut r = l + 1;
let mut ans = 2;
let mut i = n - 2;
while i >= 0 {
if intervals[i as usize][1] >= r {
i -= 1;
continue;
} else if intervals[i as usize][1] < l {
l = intervals[i as usize][0];
r = l + 1;
ans += 2;
} else {
r = l;
l = intervals[i as usize][0];
ans += 1;
}
i -= 1;
}
ans
}
}