题目与题解
{{6,7},{4,8},{1,5}}
8
7 |
6 |
| 5
4 |
|
|
1
标志:6,4,1
6—4一箭;1—二箭
{{1,5},{6,7},{4,8}}
对每一个气球的最低端排序,可以保障每一个气球最低端有序降低,此时通过判断前一个气球的最低端与后一个气球的最高端,就可以判断是否需要增加箭。
8
7 |
6 |
5 |
| 4
|
|
1
标志:5,7,8
5—一箭;7—8二箭
对每一个气球的最高端排序,可以保障每一个气球最高端有序上升,此时通过判断前一个气球的最高端与后一个气球的最低端,就可以判断是否需要增加箭。
基于贪心来对原本的气球序列的排序需要对应相应的增加箭的判决方式。
如,对气球最高端排序:
8
| 7
| 6
| 5
4 |
|
|
1
判断后一个最高端是否大于其最低端,如此这样,{1,5}同样满足条件,那么总的箭数量就是1。解答错误。
应该保证气球的最高端呈上升梯状,或者气球的最低端呈下降梯状,然后再判断另一端。控制一个变量,再判断另一端,这样的思路才能保证解题正确。
class Solution {
public:
int findMinArrowShots(vector<vector<int>>& points) {
int arrow = 1;
//满足贪心要求,将所有气球按照最低高度排
//这里使用的是气球的最低端作为参考,那么应该对最低端作为贪心的排序标准
//相反,如果使用气球的最高端作为参考,那么应该对最高端作为贪心的排序标准
sort(points.begin(), points.end(), [=](const vector<int>&first, const vector<int>&second) {return first[0] > second[0]; });
//得到前一段的最低位置,如果大于下一段最高位置;当前位置换成下一段的最低位置,继续判断
int high = 0, low = 0;
low = points[0][0];
for (int part=1;part<points.size();++part)
{
high = points[part][1];
if (low > high)
{
++arrow;
low = points[part][0];
}
}
return arrow;
}
};
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;
}
};