问题描述
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
示例 1:
输入: [ [1,2], [2,3], [3,4], [1,3] ]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
示例 2:
输入: [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。
示例 3:
输入: [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。
输入说明
首先输入区间集合的大小n(n<20000),然后输入n行,每行2个整数,表示区间的起始和结束。
输出说明
输出一个整数
输入范例
4
1 2
2 3
3 4
1 3
输出范例
1
实现思路
哔哩哔哩 '代码随想录'up的贪心算法13
实现代码
#include<iostream>
#include<vector>
#include<queue>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
bool cmp(vector<int>&a,vector<int>&b){
return a[0]<b[0];
}
int fun(vector<vector<int>> &num){
if(num.size() == 0) return 0;
sort(num.begin(),num.end(),cmp);
int countnum = 0;
for(int i = 1;i<num.size();i++){
if(num[i][0] < num[i-1][1]){
countnum++;
num[i][1] = min(num[i][1],num[i-1][1]);
}
}
return countnum;
}
int main()
{
int n;
cin>>n;
vector<vector<int>> num(n,vector<int>(2));
for(int i = 0;i<n;i++){
int x,y;
cin>>x>>y;
num[i][0] = x;
num[i][1] = y;
}
int res = fun(num);
cout<<res;
return 0;
}