LeetCode435 — 预定会议问题()-其他
LeetCode435 — 预定会议问题()
0. ref
参考自
1. 题目描述
预定会议问题:给定我们一堆区间,区间不能重叠(\([1,2]\) 和 \([2,3]\) 的 \(2\) 不算重叠),求最多能保留多少个区间?
预定会议问题:给定我们一堆区间,区间不能重叠(\([1,2]\) 和 \([2,3]\) 的 \(2\) 不算重叠),求最多能保留多少个区间?
做法:贪心,按【右端点】排序。
为什么要按照右端点排序?反证,如果按照左端点排序,看下面的例子:
|_________| 区间a
|___| 区间b
|__| 区间c
|______| 区间d
如果按照左端点升序的话,那么答案就是 \(2\) 了,但显然,答案应该是 \(3\)。
我们把区间的左右端点比作会议的开始和结束时间,一句话:开始早的会议不一定结束早!
如果我们按照右端点排序,那么一定能留给后面的会议更长的时间。
本题其实还有另外一种做法:\(LCS\),只不过是一个二维 \(LCS\) 问题,而且由于区间之间不是严格大于的原因,为我们避免了不必要的麻烦!
参见 my blog here,我们可以直接 ,不需要制定自定义 。
只不过,第一种做法是:\(O(Nlog^{N} + N)\),而 \(LCS\) 是 \(O(Nlog^{N} + Nlog^{N})\),常数大一点罢了。
本题其实还有另外一种做法:\(LCS\),只不过是一个二维 \(LCS\) 问题,而且由于区间之间不是严格大于的原因,为我们避免了不必要的麻烦!
参见 my blog here,我们可以直接 ,不需要制定自定义 。
只不过,第一种做法是:\(O(Nlog^{N} + N)\),而 \(LCS\) 是 \(O(Nlog^{N} + Nlog^{N})\),常数大一点罢了。
sort
cmp
2. 思路
3. 代码
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), [&](auto &x, auto &y){
if(x[1] == y[1]) return x[0] < y[0];
return x[1] < y[1];
});
int res = 0;
int right = -2e9;
for(auto &x : intervals) {
if(x[0] >= right) {
right = x[1];
res ++ ;
}
}
return intervals.size() - res;
}
};
0. ref
参考自
1. 题目描述
预定会议问题:给定我们一堆区间,区间不能重叠(\([1,2]\) 和 \([2,3]\) 的 \(2\) 不算重叠),求最多能保留多少个区间?
预定会议问题:给定我们一堆区间,区间不能重叠(\([1,2]\) 和 \([2,3]\) 的 \(2\) 不算重叠),求最多能保留多少个区间?
做法:贪心,按【右端点】排序。
为什么要按照右端点排序?反证,如果按照左端点排序,看下面的例子:
|_________| 区间a
|___| 区间b
|__| 区间c
|______| 区间d
如果按照左端点升序的话,那么答案就是 \(2\) 了,但显然,答案应该是 \(3\)。
我们把区间的左右端点比作会议的开始和结束时间,一句话:开始早的会议不一定结束早!
如果我们按照右端点排序,那么一定能留给后面的会议更长的时间。
本题其实还有另外一种做法:\(LCS\),只不过是一个二维 \(LCS\) 问题,而且由于区间之间不是严格大于的原因,为我们避免了不必要的麻烦!
参见 my blog here,我们可以直接 ,不需要制定自定义 。
只不过,第一种做法是:\(O(Nlog^{N} + N)\),而 \(LCS\) 是 \(O(Nlog^{N} + Nlog^{N})\),常数大一点罢了。
本题其实还有另外一种做法:\(LCS\),只不过是一个二维 \(LCS\) 问题,而且由于区间之间不是严格大于的原因,为我们避免了不必要的麻烦!
参见 my blog here,我们可以直接 ,不需要制定自定义 。
只不过,第一种做法是:\(O(Nlog^{N} + N)\),而 \(LCS\) 是 \(O(Nlog^{N} + Nlog^{N})\),常数大一点罢了。
sort
cmp
2. 思路
3. 代码
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), [&](auto &x, auto &y){
if(x[1] == y[1]) return x[0] < y[0];
return x[1] < y[1];
});
int res = 0;
int right = -2e9;
for(auto &x : intervals) {
if(x[0] >= right) {
right = x[1];
res ++ ;
}
}
return intervals.size() - res;
}
};