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;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端