类似题:LeetCode第 646 题:最长对数链(C++)_zj-CSDN博客
找到需要移除区间的最小数量,使剩余区间互不重叠,那其实就是最多的不重叠子区间,然后总大小减去最多的不重叠子区间个数就行。
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.empty()) return 0;
//按照右端点排序
sort(intervals.begin(), intervals.end(), [](const vector<int> &a, const vector<int> &b){
return (a[1] < b[1]) || (a[1] == b[1] && a[0] < b[0]);
});
int cnt = 1, r = intervals[0][1];
for(int i = 1; i < intervals.size(); ++i){
if(intervals[i][0] >= r){
++cnt;
r = intervals[i][1];
}
}
return intervals.size() - cnt;
}
};
还是类似的也可以dp:
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
if(intervals.empty()) return 0;
//按照地点排序
sort(intervals.begin(), intervals.end(), [](const vector<int> &a, const vector<int> &b){
return (a[0] < b[0]) || (a[0] == b[0] && a[1] < b[1]);
});
vector<int> dp(intervals.size(), 0);
dp[0] = 1;
for(int i = 1; i < intervals.size(); ++i){
int val = 0;
for(int j = i-1; j >= 0; --j){
if(intervals[i][0] >= intervals[j][1]){
val = max(val, dp[j]);
}
}
dp[i] = 1 + val;
}
return intervals.size() - *max_element(dp.begin(), dp.end());
}
};