leetcode435 无重叠区间
解法一(贪心):按照区间右节点排序,判断左节点是否重叠。
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
int len = intervals.size();
if(len==0) return 0;
sort(intervals.begin(),intervals.end(),[](const auto&a,const auto &b){return a[1]<b[1];});
int y=intervals[0][1];
int re=0;
for(int i=1;i<len;++i){
if(intervals[i][0]>=y){
y= intervals[i][1];
}else{
re++;
}
}
return re;
}
};
解法二(动态规划):相当于求最长递增子序列(区间)
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
int len = intervals.size();
if(len==0) return 0;
sort(intervals.begin(),intervals.end(),[](const auto&a,const auto &b){return a[1]<b[1];});
vector<int>dp(len,1);
for(int i=1;i<len;++i){
for(int j=0;j<i;++j){
if(intervals[i][0]>=intervals[j][1]){
dp[i]=max(dp[j]+1,dp[i]);
}
}
}
return len-*max_element(dp.begin(),dp.end());
}
};
解法一 时间复杂度:O(nlogn)(排序) 空间复杂度:O(1)
解法二 时间复杂度:O(n*n) 空间复杂度:O(n)