属于区间题型的第三类题。
思路:贪心,按照右端点升序,每次尽量射右端点的位置
class Solution {
public:
static bool cmp(const vector<int> &v1, const vector<int> &v2) {
return v1[1] < v2[1];
}
int findMinArrowShots(vector<vector<int>>& points) {
sort(points.begin(), points.end(), cmp);
int ans = 1, r = points[0][1]; //int ans = 0, r = INT_MIN是错误的
for (const auto& each : points) {
if (each[0] > r) {
ans++;
r = each[1];
}
}
return ans;
}
};
易错点:这道题的区间取值范围是int的整个范围,r 初始值不能取INT_MIN,可能出现的区间的[INT_MIN, INT_MAX],此时就ans不会++,ans最终为0,所以ans应该先射出一箭。