2.区间问题
给定多个区间,计算让这些区间互不重叠所需要移除区间的最少个数。
起止相连不算重叠。
输入输出样例
输入是一个数组,数组由多个长度固定为2的数组组成,表示区间的开始和结尾。
输出一个整数,表示需要移除的区间数量。
Input:[[1,2],[2,4],[1,3]]
output: 1
在这个样例中,我们可以移除区间[1,3],使得剩余的区间[[1,2],[2,4]]互不重叠。
题解
在选择要保留区间时,间的结尾十分重要:选择的区间结尾越小,余留给其它区间的空间就越大,就越能保留更多的区间。
因此,我们采取的贪心策略为,优先保留结尾小且不相交的区间。具体实现方法为,先把区间按照结尾的大小进行增序排序,每次选择结尾最小且和前一个选择的区间不重叠的区间。在样例中,排序后的数组为[[1,2],[1,3],[2,4]]。按照我们的贪心策略,首先初始化为区间[1,2];由于[1,3]与[1,2]相交,我们跳过该区间;由于[2,4]与[1,2]不相交,我们将其保留。因此最终保留的区间为[[1,2],[2,4]]。
Code:
bool ccm(const vector<int>&v1,const vector<int>&v2)
{
return v1[1]<v2[1];
}
int remo(vector<vector<int>>&vec)
{
// vector<vector<int>>res;
//按照数组区间结尾排序
int res=0;
sort(vec.begin(),vec.end(),ccm);
for(int i=0;i<vec.size();i++)
{
vector<int>sub=vec[i];
for(int j=0;j<sub.size();j++)
{
cout<<sub[j]<<" ";
}
cout<<endl;
}
int pre=vec[0][1];
for(int i=1;i<vec.size();i++)
{
if(vec[i][0]>=pre)
{
res++;
pre=vec[i][1];
}
}
return vec.size()-res;
}