leetcode 452 学习笔记(贪心,用最少数量的箭引爆气球)

该博客介绍了如何运用排序和贪心算法解决计算机科学中的一个问题——找到最少数量的箭来引爆所有气球。文章详细阐述了两种不同的贪心策略:一种是取左极限,另一种是取右极限,并通过实例解释了每种策略的实现过程。作者提供了具体的代码实现,并给出了测试样例以验证算法的正确性。
摘要由CSDN通过智能技术生成

452. 用最少数量的箭引爆气球

问题描述:传送门

在这里插入图片描述

思路:

1、sort函数 +贪心算法1(取左极限)

①先把这些气球从小到大sort排列。遇到两个相同的区间点【0,0】、【0,1】,默认第一个进去的,小于第二个。
注意,要写个cmp比较一下:

  private:
     static bool cmp(const vector<int>&a,const vector<int>&b){
            return a[0]<b[0];
             }
  public:
       sort(points.begin(),points.end(),cmp);        

②如果区间是空的,返回0;

 if(points.empty()){
            return 0;
        }

反之,取第一个点的区间为默认区间。arrows的数量默认为1。

	vector<int> range={points[0][0],points[0][1]};//设置默认区间
	int arrows =1;

从第二个点开始算,当前区间的左极限如果小于等于默认区间的右极限,取交集。

反之,把当前点设为默认区间,arrows+1。

	for(int i=1;i<points.size();i++){
	            auto cur=points[i];
	            //下一个点的左边界小于本节点的右边界
	            if(cur[0]<=range[1]){
	                range[0]=max(cur[0],range[0]);
	                range[1]=min(cur[1],range[1]);
	            }else{
	                range[0]=cur[0];
	                range[1]=cur[1];
	                arrows++;
	            }
	        }
	        return arrows;

举个例子 [[10,16],[2,8],[1,6],[7,12]] 。

①sort后:[[1,6],[2,8],[7,12],[10,16]]

②区间不为空,取第一个点【1,6】默认区间。
第二个点,要取交集。
第三个点,默认区间。
第四个点,要取交集。
算下来,arrows=2;

如下图,
在这里插入图片描述

代码:

	class Solution {
	     private:
	     static bool cmp(const vector<int>&a,const vector<int>&b){
	            return a[0]<b[0];
	             }
	public:
	    int findMinArrowShots(vector<vector<int>>& points) {
	        if(points.empty()){
	            return 0;
	        }
	        sort(points.begin(),points.end(),cmp);
	        vector<int> range={points[0][0],points[0][1]};
	        int arrows =1;
	        for(int i=1;i<points.size();i++){
	            auto cur=points[i];
	            //下一个点的左边界小于本节点的右边界
	            if(cur[0]<=range[1]){
	                range[0]=max(cur[0],range[0]);
	                range[1]=min(cur[1],range[1]);
	            }else{
	                arrows++;
	                range[0]=cur[0];
	                range[1]=cur[1];
	            }
	        }
	        return arrows;
	    }
	};

2、sort函数 +贪心算法1(取右极限)
直接算默认区间的右极限

     int pos=points[0][1];

当前区间的左极限比它大的话,才arrows++;

	for(int i=1;i<points.size();i++){
            if(points[i][0]>pos){
                pos =points[i][1];
                arrows++;
            }
        }
        return arrows;

写sort函数时,如下测试样例,遇到【0,9】排在【0,6】面前,很可能一箭射出去了。
所以要写成【0,6】,【0,9】的排序,保证两箭。
sample:
[[3,9],[7,12],[3,8],[6,8],[9,10],[2,9], [0,9] ,[3,9], [0,6] ,[2,8]]

 private:
	     static bool cmp(const vector<int>&a,const vector<int>&b){
	            return a[1]<b[1];
	             }

代码:

	class Solution {
	     private:
	     static bool cmp(const vector<int>&a,const vector<int>&b){
	            return a[1]<b[1];
	             }
	public:
	    int findMinArrowShots(vector<vector<int>>& points) {
	        if(points.empty()){
	            return 0;
	        }
	        sort(points.begin(),points.end(),cmp);
	       int pos=points[0][1];
	        int arrows =1;
	        for(int i=1;i<points.size();i++){
	            if(points[i][0]>pos){
	                pos =points[i][1];
	                arrows++;
	            }
	        }
	        return arrows;
	    }
	};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓梦林

都看到这里了,支持一下作者呗~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值