赞
踩


class Solution {
public:
int findMinArrowShots(vector<vector<int>>& points) {
}
};
问题:要求当前位置下(不许排序),要把所有的箭头引爆,需要使用多少箭
为了方便在一次遍历中识别重合,先进行排序,是按照区间左端还是右端升序呢?
其实都可以,但是建议按照右端点进行排序:
[0..................6]
[1..2]
[4..5]
Λ
[-------|]
[----|------] //这俩哥们一个箭够了
[-|---------] //如果第三个是这样的,那一根箭还是够的
| [-------] //如果是这样的呢,不行了,因为这个的start小于第一行那个end了,所以得再加一根
Λ
[-----|]
[-------|---]
[-----|---]
[--|---]
| [-----] // 只有此时需要再来一根
我们来分析下按照**左端点(起始位置)**进行排序的过程
问题:从前向后遍历遇到重叠的气球了怎么办?
举个例子,假设我们已经对气球排序了,而且得到了[1, 6],[2, 8],[7, 12],[9, 10]。

我们对这四个气球进行遍历




在以上的分析中,我们事实上是不需要考虑射击区间的左边界的,因为我们已经对气球进行了排序,所以每次的区间确定,左区间总是要改变的。我们核心要考虑的是右区间和新遍历的气球的左右两个端点的关系:
代码实现:
points[i][0]和前一个右坐标points[i-1][1]的大小关系
points[i]-1[1] < points[i+1][0],说明不重叠,此时需要一支新的箭points[i-1][1] >= points[i][0],说明有重叠区间,此时我们需要更新当前气球的右坐标用来标记重合区间的右坐标,方便接下来对比时判断是否重合,即points[i][1] = min(points[i][1] , points[i-1][1])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++) { 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; } };
按照end进行排序
步骤:
class Solution { public: int findMinArrowShots(vector<vector<int>>& points) { if (points.empty()) { return 0; } sort(points.begin(), points.end(), [](const vector<int>& u, const vector<int>& v) { return u[1] < v[1]; }); int pos = points[0][1]; int ans = 1; for (const vector<int>& balloon: points) { if (balloon[0] > pos) { // 开始区间 > 末尾区间,说明不挨着了 pos = balloon[1]; //因为是按照末尾排序的 ++ans; } } return ans; } };
思路
弓箭的起始位置和结束位置可以看做是一段区间,直观上来看,为了使用最少的弓箭数,可以尽量射中区间重叠最多的地方。
所以问题变为了:如何寻找区间重叠最多的地方,也就是区间交集最多的地方。
区间调度问题:给定一些有交集的区间,形如[[start1, end1],[start2,end2],…],求最大不相交的区间数量。
对于此题,如果最多有n个不相交的区间,则需要的箭至少为n个。
对区间调度问题,先按各区间的end升序排序,再从前向后遍历区间,对比后面区间的start和前面区间的end,检查是否有交集。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。