ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-10-09 22:03:41  阅读:158  来源: 互联网

标签:int 452 points 气球 vector 贪心 leetcode cmp


前言

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

参考题解:用最少数量的箭引爆气球-代码随想录


提交代码

方法一:贪心

贪心:每次射尽可能多的气球。射尽可能多的气球的每一箭,都有个范围。只要这个范围,被共同包含在最多的气球范围内,即可。

class Solution {
public:
    struct cmp{
        bool operator() (vector<int>& v1, vector<int>& v2){
            // start越小,越靠前;start相同,end越小,越靠前
            if(v1[0]<v2[0])
                return true;
            else if(v1[0]==v2[0])
                return v1[1]<v2[1];
            else
                return false;
        }
    };

    int findMinArrowShots(vector<vector<int>>& points) {
        sort(points.begin(),points.end(),cmp());
        int count = 1; //   1 <= points.length <= 10^4
        int start = points[0][0];
        int end = points[0][1];
        for(int i=1; i<points.size(); i++){
            if(points[i][0]>=start && points[i][0]<=end){
                // 当前气球,可以被上一个气球连带zhapo
                // 同时缩小范围,范围为一针可以都扎破的范围
                start = min(start,points[i][0]);
                end = min(end,points[i][1]);
                continue; 
            }
            // 开启新的范围
            count++;
            start = points[i][0];
            end = points[i][1];
        }
        return count;
    }
};

方法二:贪心

贪心:每次射尽可能多的气球。将上面的代码简化。下面代码来自参考题解。

代码思路:找重复的气球,寻找重叠气球最小右边界

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.size() == 0) return 0;
        sort(points.begin(), points.end(), cmp);

        int result = 1; // points 不为空至少需要一支箭
        for (int i = 1; i < points.size(); i++) {
            // 因为排序,points[i][0]必然大于等于points[i - 1][0]
            // 当开头,比上一个开头还大,完全不想交
            if (points[i][0] > points[i - 1][1]) {  // 气球i和气球i-1不挨着,注意这里不是>=
                result++; // 需要一支箭
            }
            else {  // 气球i和气球i-1挨着
                // 因为排序的原因,范围的开头在不断向大处缩小
                points[i][1] = min(points[i - 1][1], points[i][1]); // 更新重叠气球最小右边界
            }
        }
        return result;
    }
};

总的来说,虽然方法二简化了些,但是我写的方法一更容易懂~

标签:int,452,points,气球,vector,贪心,leetcode,cmp
来源: https://blog.csdn.net/sinat_38816924/article/details/120679824

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有