题目:
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
来源:leetcode
分析:
题目换一种说法,找最多的不重叠区间,即最经典的贪心问题。
贪心策略:最早结束,给剩余的留尽可能多的空间。
–>受戳爆气球问题的启发:相同终点的选哪个有影响吗?
答:显然没有,因为考虑下一个的时候和考虑第一个时一样,只是为了给后面的留更多的空间。
代码:
class Solution {
public:
int eraseOverlapIntervals(vector<vector<int>>& inter) {
if(inter.size()==0) return 0;
sort(inter,0,inter.size()-1);
int end=inter[0][1];
int num=1;
for(int i=0;i<inter.size();i++)
{
if(end<=inter[i][0]){
num++;
end=inter[i][1];
}
}
return inter.size()-num;
}
void sort(vector<vector<int>>& a,int left, int right)
{//a[i][j] 对i个进行排序,按照a【x】的第一个 (最早结束)
if(left >= right) return;
int i = left;
int j = right;
int key = a[left][1];
int key0 =a[left][0];
while(i < j)
{
while(i < j && key <= a[j][1]) j--;
a[i][0]=a[j][0];
a[i][1]=a[j][1];
while(i < j && key >= a[i][1]) i++;
a[j][0] = a[i][0];
a[j][1] = a[i][1];
}
a[i][1] = key;
a[i][0]=key0;
sort(a,left, i - 1);
sort(a,i + 1, right);
}
};