leetcode435.无重叠区间(中等)
属于区间问题的第二类题。 思路一:贪心 实现细节:按照右端点从小到大排序。
class Solution {
public:
static bool cmp(const vector<int>& v1, const vector<int>& v2){
return v1[1] < v2[1];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
int n = intervals.size();
sort(intervals.begin(), intervals.end(), cmp);
int r = INT_MIN, ans = 0;
for (auto& each : intervals) {
if (each[0] >= r) {
ans++;
r = each[1];
}
}
return n - ans;
}
};
方法二:dp(超时,通不过,只用来拓展思路) 题目等价为:不重叠找出最多的区间 具体思路:先按照左端点/右端点升序排列。 dp[i]表示以v[i]结尾最多的区间个数。 转移方程:dp[i]=dp[j]+1 (0<=j<i且v[j].second <= v[i].first) 复杂度达到O(n^2)太高了,超时。。。。
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
int n = intervals.size();
vector<int> dp(n, 1);
vector<pair<int, int>> v;
sort(intervals.begin(), intervals.end());
for (auto& each : intervals) {
v.push_back({
each[0], each[1]});
}
for (int i = 1; i < n; ++i) {
for (int j = 0; j < i; ++j) {
if (v[j].second <= v[i].first) dp[i] = max(dp[i], dp[j] + 1);
}
}
return n - dp[n - 1];
}
};
