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

✅做题思路or感想

这题亦是一道贪心(这种题目不明所里的一看上去迷糊的一般都是贪心)

难点有二:

  • 贪心策略
  • 如何实现贪心的策略

贪心策略

这里的策略倒是很简单:只要射的箭都是往气球最重合的地方射,所用的数量就会最少

实现策略

这里为了让气球能够重合,所以要对原数组进行排序。难点在于如何对一个二维vector排序呢(即是如何写sort的cmp呢)。

  • 首先先明确,排序的规则是:对每个气球的起始位置排序,即是对point[i][0]排序

  • 而后便确定了代码

    static bool cmp (vector<int>& a, vector<int>& b) {
            return a[0] < b[0];
        }
    
  • 这里值得一说的是在力扣里写cmp,前面必须要加一个前缀static

那如何确定气球的最大重合区域呢?用两个变量来表示就可以了

class Solution {
public:
    //写sort的cmp
    static bool cmp (vector<int>& a, vector<int>& b) {
        return a[0] < b[0];
    }
    int findMinArrowShots(vector<vector<int>>& points) {
        //排序是找重合区间的条件
        sort(points.begin(), points.end(), cmp);
        //用两个变量来表示重合区间
        //因为要用箭引爆气球至少需要一支箭,所以这里shotCount初始化为1
        int shotStart = points[0][0], shotEnd = points[0][1], shotCount = 1;
        for (int i = 0; i < points.size(); i++) {
            //这里的if,else很有讲究,气球重合的状况有很多!但是不重合的状况只有一种
            //故这里把简单的写在if中,复杂的直接交给else就好了
            if (shotEnd < points[i][0]) {	//如果前后气球没有交集
                shotCount++;	//把前面重合的气球射爆
                //重新定义重合区间(或者这里说是瞄准区间更合理点?)
                shotStart = points[i][0];
                shotEnd = points[i][1];
            } else {
                //更新重合区间,取交集
                shotStart = max(shotStart, points[i][0]);
                shotEnd = min(shotEnd, points[i][1]);
            }
        }
        return shotCount;
    }
};
posted @   北原春希  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示