leetCode 435 无重叠区间(区间问题)

题目链接:点击查看

题目描述:

给定多个区间,计算让这些区间互不重叠所需要移除区间的最少个数。起止相连不算重叠。

输入输出:

输入: [ [1,2], [2,3], [3,4], [1,3] ]

输出: 1

输入: [ [1,2], [1,2], [1,2] ]

输出: 2

题目分析:

此题采取贪心策略 ,区间的结尾越小,预留给其他空间的结尾就越大,保留的空间也就越多, 具体方法 为把区间按照结尾的大小进行升序排序(在此用了c++的lambda匿名函数作为自定义排序方式 作为sort第三个参数),每次选择结尾小且和前一个选择的区间不重叠的区间。因此贪心策略为:优先保留结尾小且不相交的区间。

代码:

int eraseOverlapIntervals(vector<vector<int>>& intervals) 
{
     if(intervals.empty())
	 {
	   return 0;	
	 } 
	 int n=intervals.size();
	 sort(intervals.begin(),intervals.end(),[](vector<int>a,vector<int>b){
	    return a[1]<b[1];
	 });//用c++lambda匿名函数来自定义排序方式:即按照每个一维数组第二个元素大小升序排序 
	 int total=0,prev=intervals[0][1];//total表示所要移除区间的个数 
	 for(int i=1;i<n;i++)
	 {
	 	if(intervals[i][0]<prev)
	 	{
	 		++total;
		}
		else
	    {
	    	prev=intervals[i][1];
		}
	 }
     return total;	 
}