贪心算法三道总结:合并区间,无重叠区间,用最少数量的箭引爆气球

目录

1 合并区间

2 无重叠区间

3 用最少数量的箭引爆气球


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 为当前气球的结束位置。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值