题目
题解
题目的要求等价于「选出最多数量的区间,使得它们互不重叠」
会出现,一个大区间包含多个小区间的情况
-
动态规划
动规五部曲:
确定dp数组以及下标的含义:代表以第i个区间为最后一个区间,最多有多少个区间
确定递推公式:dp[i] = max(dp[i], dp[j]+1);
dp数组初始化:dp[0]=1; -
贪心算法
代码
// class Solution {
// public:
// int eraseOverlapIntervals(vector<vector<int>>& intervals) {
// int n=intervals.size();
// if(n==0) return 0;
// sort(intervals.begin(), intervals.end());
// vector<int> dp(n,1);
// for(int i=0;i<n;i++)
// for(int j=0;j<i;j++)
// if(intervals[j][1] <= intervals[i][0])
// dp[i] = max(dp[i], dp[j]+1);
// return n-dp[n-1];
// }
// };
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
int n = intervals.size();
if(n==0) return 0;
sort(intervals.begin(), intervals.end(), [](const auto& u, const auto& v) {
return u[1] < v[1];
});
int right = intervals[0][1];
int ans = 1;
for (int i = 1; i < n; ++i) {
if (intervals[i][0] >= right) {
++ans;
right = intervals[i][1];
}
}
return n - ans;
}
};