题目方法:
2种:
1贪心
2dp,其中贪心的效率更高
贪心思路:
把空间按照终点从小到大排序,这是因为结尾越小,留给后续区间的范围就越多,可能容纳的区间数也就越多
dp思路:
跟最长上升子序列一样,dp[n]代表选中n的前提下,从[0..n]中最多能保留的无重叠子区间的个数,之后遍历找到个数最多的情况num,然后返回n-num
贪心算法
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& t) {
int n=t.size();
if(n<2)
return 0;
sort(t.begin(),t.end(),cmp);
int ret=0;
int end=t[0][1];
for(int i=1;i<n;i++){
if(t[i][0]<end)
ret++;
else
end=t[i][1];
}
return ret;
}
private:
static bool cmp(vector<int> a,vector<int> b){
if(a[1]!=b[1])
return a[1]<b[1];
return a[0]<=b[0];
}
};
动态规划
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& t) {
int n=t.size();
if(n<2)
return 0;
sort(t.begin(),t.end(),cmp);
vector<int> dp(n,1);//dp代表选中n的前提下从【0.。n】最多能保留的区间数
for(int i=1;i<n;i++)
for(int j=0;j<i;j++)
if(t[i][0]>=t[j][1])
dp[i]=max(dp[i],1+dp[j]);
int num=1;
for(int i=0;i<n;i++)
if(num<dp[i])
num=dp[i];
return n-num;
}
private:
bool static cmp(vector<int> a,vector<int> b){
return a[1]<=b[1];
}
};