目录
1 合并区间
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end());
vector<int>res;//临时存放
vector<vector<int>>ans;
res=intervals[0];
for(int i=1;i<intervals.size();i++)
{
if(intervals[i][0]<=res[1]){
//合并
res[1]=max(res[1],intervals[i][1]);
}
else
{
ans.push_back(res);
res=intervals[i];
}
}
ans.push_back(res);
return ans;
}
};
从第二个区间开始,依次处理每个区间。
如果当前区间的起始点小于或等于 res的结束点,说明两个区间有重叠:
更新 res 的结束点为 res结束点和当前区间结束点中的最大值。
如果当前区间的起始点大于 res的结束点,说明两个区间没有重叠:
将 res 添加到结果数组 ans 中。更新 res 为当前区间。
处理最后一个区间:
遍历结束后,将最后一个 res 添加到 ans 中,因为最后一个区间不会在循环内被添加到结果中。
2 无重叠区间
class Solution {
public:
static bool cmp(vector<int>&a, vector<int>&b)
{
return a[1]<b[1];
}
int eraseOverlapIntervals(vector<vector<int>>& intervals) {
int res=0;
sort(intervals.begin(),intervals.end(),cmp);
int maxx = intervals[0][1];
for(int i=1;i<intervals.size();i++)
{
if(intervals[i][0]<maxx)res++;
else
{
maxx=intervals[i][1];
}
}
return res;
}
};
从第二个区间开始,依次检查每个区间是否与当前不重叠区间集合(由 maxx 表示)发生重叠。
如果当前区间的起始时间小于 maxx,说明这个区间与前面的区间发生重叠:增加 res 计数器。
如果当前区间的起始时间不小于 maxx,说明这个区间与前面的区间不重叠:
更新 maxx 为当前区间的结束时间。
返回结果:最后,返回需要移除的重叠区间的数量 res。
3 用最少数量的箭引爆气球
class Solution {
public:
static bool cmp(vector<int>&a, vector<int>&b){
return a[1]<b[1];
}
int findMinArrowShots(vector<vector<int>>& points) {
//
//
if(points.size())
sort(points.begin(),points.end(),cmp);
int res=1;
int maxx= points[0][1];
for(int i=1;i<points.size();i++)
{
if(maxx<points[i][0])
{
res++;
maxx=points[i][1];
}
}
return res;
}
};
- 从第二个气球开始遍历所有气球。
- 如果当前气球的起始位置大于
maxx
,说明当前气球与之前的气球不重叠,需要额外的箭:- 增加
res
计数器,并更新maxx
为当前气球的结束位置。
- 增加