题目描述
原题链接:452. 用最少数量的箭引爆气球
解题思路
局部最优解: 气球出现重叠时,在重叠区域射一箭,以此方式射完所有气球
全局最优解: 所有气球射完,所用弓箭最少。
先按气球左边界从大到小排列。每次对比前后两个区间,当区间不重叠时,需要用到一个弓箭,弓箭数加一。当出现重叠时,更新此时允许发射范围的边界,更新第二个气球的右区间,取重叠边界。
class Solution {
public:
static bool cmp(const vector<int>& a, const vector<int> & b) {
return a[0] < b[0];
}
int findMinArrowShots(vector<vector<int>>& points) {
sort(points.begin(), points.end(), cmp); // 按从小到大排序
int res = 1; // 仅有一个时,也需要一个
for(int i = 1; i < points.size(); i++) {
if(points[i - 1][1] < points[i][0]) { // 第二个气球的左边界与第一个气球的右边界重叠
res++;
}
else {
points[i][1] = min(points[i - 1][1], points[i][1]); // 右边界,取满足两者重叠的边界
}
}
return res;
}
};