0%

435. 无重叠区间

435. 无重叠区间

问题转换为求最多的不重合区间的数量

超时的解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), [](vector<int>& v1, vector<int>& v2)
{
return v1[0] < v2[0];
});
int n = intervals.size();
vector<int> dp(n, 1);
int ret = 1;
for(int i = 1; i < n; ++i)
{
for(int j = 0; j < i; ++j)
{
if(intervals[i][0] >= intervals[j][1])
{
dp[i] = max(dp[i], 1 + dp[j]);
ret = max(dp[i], ret);
}
}
}
return n - ret;
}
};

优化

参考300. 最长递增子序列的贪心+二分解法

顺便看看题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), [](const auto& v1, const auto& v2)
{
return v1[1] < v2[1];
});
int right = intervals[0][1];
int ret = 1;
int n = intervals.size();
for(int i = 1; i < n; ++i)
{
if(intervals[i][0] >= right)
{
right = intervals[i][1];
++ret;
}
}
return n - ret;
}
};

如果右边那个可以的话,比右边那个右端点小的肯定也可以